uva 1428 Ping pong (樹狀陣列)

2021-06-26 10:11:26 字數 1032 閱讀 6946

題意:

一條街道上有n個選手,他們要打桌球賽,每個人有乙個自己的skill rank,且是n個不同的數。每場比賽需要乙個裁判,要求這個裁判的skill rank不能高於也不能低於這兩個選手,且在街上住的位置必須在兩個選手之間。問可以組織多少場比賽。

開始想到了可以用樹狀陣列處理每個人前面有多少sr(skill rank)大於他的。但是開始想法是列舉起止點開中間有多少符合要求的裁判,是n方的。看了劉汝佳白書才知道正確做法是列舉中間的裁判。

對於裁判i,假設我們知道他之前sr小於他的人數front【i】,和之後sr大於他的人數back【i】。

那麼他能組織的比賽數量就是front【i】*back【i】+(i-1-front【i】)*(n-i-back【i】)   (左小右大和左大右小)

這樣o(n)遍歷一遍就行了。

求front【i】,back【i】的方法和求逆序數一樣。

求出front【i】後求back【i】不需要重新排序,清空c陣列後從後往前再做一遍,但因為遍歷是從後到前,而查詢還是從前往後的。所以做的時候把需要+1的位置ord修改為n-i-ord就可以了。

**:

#include #include #include #include using namespace std;

#define ll long long

struct nodeg[20010];

int a[20010];

int c[20010];

int front[20010];

int back[20010];

int n;

int lowbit(int n)

int sum(int p)

return res;

}void add(int p,int n)

}bool cmp(node a,node b)

long long res=0;

for(int i=1;i<=n;i++)

printf("%lld\n",res);

}return 0;

}

UVA1428 Ping pong 樹狀陣列

uva1428 ping pong 樹狀陣列 題目鏈結 題目大意 有n個人,每個人都有乙個技能值ai,現在要開展桌球比賽,要求要有兩個選手和乙個裁判,要求裁判需要在兩名選手的中間而且技能值也是在兩名選手的中間,問可以開展多少場比賽。解題思路 對於第i個選手當裁判的話,設它前面位置的選手有ci個技能值...

UVA 1428 Ping Pong 樹狀陣列

取low min a i 1 i n up max a i 1 i n 那麼區間就是,那麼只要統計出當前a i 左邊有多少比他小的,右邊有多少比他小的即可,因為給出的序列是有順序的,所以在加入需要加入乙個統計乙個,如果先全部加入了,那麼則會導致統計結果變大。include include inclu...

UVA1428 Ping pong 樹狀陣列

傳送門 思路 權值樹狀陣列。考慮列舉每個位置作為裁判對答案的貢獻。顯然有兩種情況 1.a l i r l i r1.a l 1.a l i r l i2.a l a i a r l i r2.a l a i a r l2.a l a i a r l i因為每個數互異。根據乘法原理所以貢獻為 llo ...