UVALive 4329 Ping pong(樹狀陣列求逆序數+順序數)
題意:對於給定的一個長度為n序列a,對於每個位置i,若左邊存在一個數a[l],右邊存在一個數a[r],滿足a[l] < a[i] < a[r]或a[l] > a[i] > a[r],則(l, r)構成一對,求總共有多少對。
思路:雖然先學的是線段樹,但是這類問題也可以用樹狀陣列解決。考慮2個數組c和d,對於位置i,c[i]表示位置i左邊有c[i]個數比它小,d[i]表示位置i右邊有d[i]個數比它小。則最後的結果就是
程式碼:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
const int N = 2e4 + 10;
const int M = 1e5 + 10;
int s[M << 2];
int c[M], d[M];
int a[N];
int n;
int lowbit(int x) {
return x & (-x);
}
void add(int x) {
while (x <= M) {
s[x]++;
x += lowbit(x);
}
}
int sum(int x) {
int res = 0;
while (x > 0) {
res += s[x];
x -= lowbit(x);
}
return res;
}
int main() {
int t_case;
scanf("%d", &t_case);
for (int i_case = 1; i_case <= t_case; i_case++) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf ("%d", &a[i]);
memset(s, 0, sizeof(s));
for (int i = 1; i <= n; i++) {
c[i] = sum(a[i] - 1);
add(a[i]);
}
memset(s, 0, sizeof(s));
for (int i = n; i >= 1; i--) {
d[i] = sum(a[i] - 1);
add(a[i]);
}
long long res = 0;
for (int i = 2; i < n; i++)
res += 1LL * c[i] * (n - i - d[i]) + 1LL * (i - 1 - c[i]) * d[i];
printf("%lld\n", res);
}
return 0;
}
相關推薦
UVALive 4329 Ping pong(樹狀陣列求逆序數+順序數)
題意:對於給定的一個長度為n序列a,對於每個位置i,若左邊存在一個數a[l],右邊存在一個數a[r],滿足a[l] < a[i] < a[r]或a[l] > a[i] > a[r],則(l, r)構成一對,求總共有多少對。 思路:雖
A - Ping pong(樹狀陣列+順序對)
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 81 Accepted Sub
HDU 2492 Ping pong(樹狀陣列)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5575 Accepted Submis
POJ 3928-Ping pong(樹狀陣列+加/乘法原理)
Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2982 Accepted: 1103 Description N(3<=N<=20000) ping po
poj3928 Ping pong(樹狀陣列)
題意:有n個乒乓球選手,住在一條直線上,從左到右依次輸入。每個選手有一個技術等級值。他們想打比賽,就要找裁判,為了省時和公正,選裁判的條件為裁判的位置和技術等級都在兩位選手之間,求能打多少場比賽。
Ping pong(樹狀陣列)
N(3<=N<=20000) ping pong players live along a west-east street(consider the street as a line segment). Each player has a unique skill rank. To impro
tokitsukaze and Inverse Number(樹狀陣列求逆序對及逆序對性質)
題目連結: tokitsukaze and Inverse Number 題意: tokitsukaze給你一個長度為n的序列,這個序列是1到n的一種排列。 然後她會進行q次操作。每次操作會給你L R k這三個數,表示區間[L,R]往右移動k次。 移動一次的定義是:
Ping pong 利用樹狀陣列儲存
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4174 利用樹狀陣列儲存能力值 N (3 ≤ N ≤ 20000) pin
hdu 2492 Ping pong 樹狀陣列 求逆序數
題意:有t組資料,每行資料的第一個數 n 表示有n個人,每個位置上的資料代表選手的技能值,現在要三個人組隊,按照位置的順序,三個人中間的人是裁判,兩邊的選手,裁判的技能值要跟位置一樣位於兩位選手之間。 思路:一個點一個點的判斷,求該點點左邊比它大的數的個數,右邊比它小的數
2492Ping pong(樹狀陣列|權值線段樹)
Ping pong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5424 Accept
POJ——2299(Ultra-QuickSort)樹狀陣列求逆序數
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacen
[poj2828]Buy Tickets(樹狀陣列求第k大)
傳送門 題意: i個人排隊,對於第i個人,我們知道他排在第pi個人後面(可以插隊)且他有一個權值val,我們需要輸出排好之後每個人的權值。 首先我想的是連結串列來模擬,但是發現由於p[i]指的是位置而不是編號,所以連結串列是隻能O(n^2)的。 那麼怎麼辦呢
瀋陽網路賽 J題 Ka Chang (樹狀陣列+dfs序+分塊思想)
Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero point. Then, you need to handle QQ operations. The
線段樹或樹狀陣列求逆序數(附例題)
線段樹或樹狀陣列求逆序數 假設給你一個序列 6 1 2 7 3 4 8 5, 首先我們先手算逆序數, 設逆序數為 N; 6的前面沒有比他大的數 N +=0 1的前面有一個比他大的數 N+=1 2
zoj 3635(樹狀陣列求K大)
zoj題目連結:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3635 解題報告人:GHQ(SpringWater) 題目大意:每次從編號1-n刪除一個數字,重新編號1-(n-1),重複操作,問你
[zoj4046][樹狀陣列求逆序(強化版)]
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4046 題意:有一個含有n個元素的數列p,每個元素均不同且為1~n中的一個,求出將數列變為迴圈遞增序列至少需要左右相鄰的數交換多少次 題目分析:先看簡化版的題目:如果只有1 2 3
離散化及樹狀陣列求逆序對
用樹狀陣列求逆序對的時候注意:要統計b[i]-1的字首和,因為可能有相同值的元素 不去重離散化: sort(a+1, a+n+1, cmp); for(int i=1; i<=n; i++) { if(i == 1 || a[i].val != a[i-1].val) { to
樹狀陣列求逆序對【TSOJ 1232】
傳送門就不傳送了,你們也傳送不進來; 就是一個求逆序對的裸題; 直接離散化+樹狀陣列就完事了。 樹狀陣列區間更新和區間查詢寫 這題總是不對; 我也不知道為啥,過幾天再研究吧。 單點更新的樹狀陣列寫對了; 總之就是如果用樹狀陣列的話一定要離散化。 下面是程式碼: #in
樹狀陣列求逆序對
第一篇部落格就是樹狀陣列,已經過去半年了我樹狀陣列還是隻會個模板= = CF1042D的題解一直看不懂,看到下面有人說和逆序對有關係,所以還是先補一下逆序對吧。 洛谷P1908是逆序對的模板題,資料很強,很好,就是題解質量參差不齊,很多人在資料加強後根本都是WA的,所以果
咳咳,用樹狀陣列求逆序對及例題
關於樹狀陣列,相信大家都已經比較熟悉了。。。 那麼,我們就先來砍一刀例題(嘻嘻) 輸入 給出n以及n個數,求這其中的逆序對個數 PS:逆序對,就是序列中ai>aj且i<j的有序對。 輸入: 6 5 4 2 6 3 1 輸出: 11 n<=5*10^5 ai&