題目大意: 一條大街上住著 n 個桌球愛好者,經常比賽切磋技術,每個人有乙個不同的技能值ai。每場比賽需要三個人,兩名選手,一名裁判。但是裁判必須住在兩名選手之間,而且裁判的技能值不能小於或小於兩名選手的技能值。問共有多少種比賽。
思路 :列舉裁判,找出位於裁判前面的比裁判技能小的人數和位於裁判後面技能比裁判大的人數,這兩個數相乘,並累加到sum中;再找出位於裁判前面技能比裁判大的人數,和位於裁判後面的技能比裁判小的人數,這兩個數相乘,將積累加到sum中。
找人數時要用到樹狀陣列: 譬如找位於裁判前面技能比裁判小的人數時,用 pre[i] 儲存位於裁判前面的技能為 i 的人數,故位於裁判 (技能為a[k]) 前面的技能比裁判小的人數為pre[1] + per[2] + ... + pre[a[k]] 的累加和。其它的情況可以此類推。
#include#include#include#include#include#include#include#includeusing namespace std;
#define inf 0x7fffffff
int n,t,a[100002],pre[100002],late[100002];
long long sum,c1[100002],c2[100002],max;
int lowbit(int x)
int sum(int x,long long c)
return res;
} void add(long long c,int x,int d)
} int main()
memset(pre,0,sizeof(pre));
pre[a[1]] = 1;
memset(late,0,sizeof(late));
for(i=2;i<=n;i++)
late[a[i]] = 1;
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for(i=1;i<=100000;i++)
} for(i=2;iprintf("%i64d\n",sum);
}return 0;
}
樹狀陣列 hdu2492 Ping pong
如果是列舉參加比賽的人,那麼列舉起來就非常的複雜了 如果是列舉裁判,題目會變得簡單很多 假如裁判是第i個人,那麼參加比賽的肯定分別在i的左邊和i的右邊 那麼我就可以統計 1,i 1 這個區間內有多個人的rank小於等於i,i 1,n 這個區間內有多少人的rank大於等於i,兩者相乘,就是左邊小於等於...
樹狀陣列 POJ2492 Ping Pong
題意 按順序給定一些人和能量值。問按照順序選人,中間人能量值在兩邊人能量值的中間,問最多有多少種選法 思路 一次ac 有木有!其實是照著書上題解的思路打的。設c i 為某a i 處左邊能量值比他小的人數和,d i 為右邊能量值比他大的人數和,然後乙個簡單公式即可。關鍵是怎樣快速的求c i 以a i ...
Trie樹(字典樹)HDU 1251
又稱單詞查詢樹,trie樹 是一種 樹形結構 是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的 字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比 雜湊樹高。根節點不包含字元,除根節點外每乙個節...