poj 3928 Ping pong 樹狀陣列

2021-06-17 22:24:23 字數 1208 閱讀 2816

以裁判為基礎計算,每個運動員的技術水平都是不變的,他們對應的編號也是不變的,

首先將它們按技術水平排序,但對應的編碼不變 如

技術:9 1 2 5 4

編碼 1 2 3 4 5

排序後: 1 2 4 5 9

編碼 : 2 3 5 4 1

再找他們每個人的左邊(比他小的) 有多少人, 右邊(即比他大的) 有多少人,

那麼這個人就可以做 (左邊*右邊) 個人的裁判,同理 在反過來求,

如何計算比他小的, 首先對水平排序,從小到大遍歷 比他小的水平一定先放入對應位置,如果在它左邊就小,

當然右邊可能也有,但不計算在內,

如何計算比他大的 從大到小遍歷, 比他大的水平先放入對應的位置,如果他在左邊就大於它, 右邊也可能有

但不計算,

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

const int maxn = 2e4+9;

const int maxn1 = 1e5+4;

int a[maxn], da[maxn1], ra[maxn], c[maxn], n;

int left[maxn], reft[maxn];

int lowbit(int x)

void add(int x, int d)

}int sum(int x)

return ret;

}int main()

sort(a+1, a+1+n);

for(int i = 1; i <= n; i++) ra[i] = da[a[i]];//按水平從小到大,記錄位置。

memset(c, 0, sizeof(c));

for(int i = 0; i <= n; i++) left[i] = reft[i] = 0;

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

memset(c, 0, sizeof(c));

for(int i = n; i > 0; i--)

long long ans = 0;

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

ans += left[i]*(n-i-reft[i]) + reft[i]*(i-1-left[i]);

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

}}

POJ3928 Ping pong 樹狀陣列

題目中只n個人,每個人有乙個id和乙個技能值,一場比賽需要兩個選手和乙個裁判,只有當裁判的id和技能值都在兩個選手之間的時候才能進行一場比賽,現在問一共能組織多少場比賽。這道題目是用 樹狀陣列統計問題。首先我們要對技能值從小到大排序,然後利用每乙個選手的id對樹狀陣列進行維護。每次維護乙個id之前先...

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...