poj 2481 Cows (樹狀陣列)

2021-06-21 12:22:12 字數 1486 閱讀 7507

小記:之前沒做什麼修改之前,在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...