小記:之前沒做什麼修改之前,在poj上提交1393ms ac了。然後在hdu的web diy裡提交gnu c++ 超時了、於是不斷的改,在輸出的地方花費時間太多了。就是為了保證每兩個數之間有乙個空格,然後末尾沒有空格,我在for裡面加了乙個判斷,只要不是末尾就輸出乙個空格。然後就這樣超時了。。 樹狀陣列全用了inline。 改了一下輸出之後。poj969ms,hdu web diy 2250ms 都ac了
思路:樹狀陣列的應用的難點就是你要在**用樹狀陣列,使得結果是你要的答案。
這裡我是對輸入的區間先全部存入乙個結構體陣列,結構體儲存每個區間的左右值(l,r),以及輸入的次序(id)。
然後對該結構體陣列以x座標從大到小,如果x座標想等,以y座標從小到大的順序排,
inline bool cmp1(const node& a,const node& b)
這樣做的原因是,我們等下就可以從排好序的陣列的最後乙個開始算起,對y用樹狀陣列,求得它前面大於等於它的y的數的個數(這裡的前面指的是在它前面算過的的數),
ans[a[k].id] = t - 1 - k - sum(a[k].r);
如果當前區間和前面的乙個區間是相同的,那麼它的結果就是前面的區間的計算結果,
if(k+1
算出來的這個值就是這個區間的answer。
因為x從小到大,那麼就保證了越前面的x越 大,越後面的x越小,我們從最後乙個算起,那麼只要不是和前面區間相同,那麼之前算過的區間中y值大於等於它的區間就都是符合比它牛的條件的。
例如:1 2
0 33 4
排好序後:
3 41 2
0 3從0 3開始算起,3前面沒有大於等於它的數,所以0 3的答案是0,
然後1 2,2前面有個大於它的3,所以1 2的答案是1,
然後3 4,4前面算過的沒有大於等於它的數,所以3 4 的答案是0,
用id存入,輸出的答案就是1 0 0
因此保證了演算法的正確性。
**:#include #include #include #define mst(a,b) memset(a,b,sizeof(a))
#define max_ 100010
#define max 100010
struct nodea[max_];
int c[max_], ans[max_];
inline int lowbit(int x)
inline void add(int x,int num)
}inline int sum(int x)
return cnt;
}inline bool cmp1(const node& a,const node& b)
int main()
std::sort(a,a+t,cmp1);
mst(c,0);
for( k = t-1; k > -1; --k){
if(k+1
POJ 2481 Cows 樹狀陣列
樹狀陣列 其實這題和 poj 2352 或者 就是道用樹狀陣列求逆序數的題目。先排序,我的排序是按照先s從小到大,如果s相等 e從大到小。貌似也沒什麼了。就樹狀陣列吧。include include include include include define inf 0x7fffffff defi...
poj 2481 Cows(樹狀陣列)
題意 山坡上長滿三葉草,給定一群牛和他們喜愛的範圍 s,ei 如果一頭牛的s小於等於另一頭牛而e大於等於另一頭牛的,且s和e不同時相等,那麼這頭牛就比另一頭牛強壯。可以先對e從大到小排序,這樣保證遍歷時後出現的牛的上界一定滿足小於等於前面的,這樣只需要判斷他的下界滿不滿足就行,這就想到了用樹狀陣列。...
POJ2481 Cows 樹狀陣列
這題的意思是求區間覆蓋問題 si sj andej eiand ei si ej sj 求區間比當前區間大的個數。先按照s,e中的e從大到小排序,如果e相等,則按照s從小到大排序 聯想區間定義,右區間要大於當前值,左區間要小於當前值 滿足後用樹狀陣列乙個個插入求前面的個數即可 include inc...