題意:
一條街道上有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 ...