1. 程式人生 > >UVALive 4329 Ping pong(樹狀陣列求逆序數+順序數)

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]個數比它小。則最後的結果就是

i=1nc[i](nid[i])+(i1c[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——2299Ultra-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&