POJ3928 Ping pong 樹狀陣列

2021-06-21 10:09:09 字數 1031 閱讀 5406

題目中只n個人,每個人有乙個id和乙個技能值,一場比賽需要兩個選手和乙個裁判,只有當裁判的id和技能值都在兩個選手之間的時候才能進行一場比賽,現在問一共能組織多少場比賽。。。

這道題目是用 樹狀陣列統計問題。首先我們要對技能值從小到大排序,然後利用每乙個選手的id對樹狀陣列進行維護。。

每次維護乙個id之前先查詢sum(id) 與sum(n)-sum(id)。。

打個比方,我們當前維護id :i 那麼sum(id)可知是   所有比這個id小  且  能力值小於這個id的能力值(之前排序後,在i維護之前所有人的能力值都小於等於 這個id的能力值),同理sum(n)-sum(id)是 所有比這個id大   但   能力值小於這個id的能力值,將兩個值分別記為 l和r(有點抽象,具體看**理解)。。

那麼當 id為i的人 為裁判時可以舉辦l*(n-i-r)+r*(i-1-l),

求出所有人當裁判的可能,就是我們要統計的答案。

#include#include#include#include#include#include#include#includeusing namespace std;

#define mod 100000007

#define eps 1e-8

#define ll long long

#define ull unsigned long long

#define inf 0x3f3f3f3f

#define mnx 20020

int c[mnx], n;

struct player

}ch[mnx];

int lowbit( int x )

int sum( int x )

return ret;

} void add( int x, int d )

}int main()

ll ans = 0;

sort( ch+1, ch+n+1 ); //ch[i].p已經排好序

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

cout<

poj 3928 Ping pong 樹狀陣列

以裁判為基礎計算,每個運動員的技術水平都是不變的,他們對應的編號也是不變的,首先將它們按技術水平排序,但對應的編碼不變 如 技術 9 1 2 5 4 編碼 1 2 3 4 5 排序後 1 2 4 5 9 編碼 2 3 5 4 1 再找他們每個人的左邊 比他小的 有多少人,右邊 即比他大的 有多少人,...

POJ 3928 Ping pong(樹狀陣列)

題意 每個人都有乙個獨特的排名 數字大小 與獨特的位置 從前往後一條線上 求滿足排名在兩者之間並且位置也在兩者之間的三元組的個數 思路 單去列舉哪些數字在兩者之間只能用o n 3 時間太高,但是可以轉變思想。我們可以轉化為對於每個數字a,求出後面比當前數a大的每個數b,再求出數b後面比當前數b大的數...

POJ 3928 Ping pong 樹狀陣列

樹狀陣列的運用 具體就是列舉每個裁判,左邊比裁判小的個數乘以右邊比裁判大的個數,以及左邊比裁判大的個數乘以右邊小的個數,總和即為結果 id sdj22251 prog calfflac lang c include include include include include include in...