題意:山坡上長滿三葉草,給定一群牛和他們喜愛的範圍【s,ei】,如果一頭牛的s小於等於另一頭牛而e大於等於另一頭牛的,且s和e不同時相等,那麼這頭牛就比另一頭牛強壯。
可以先對e從大到小排序,這樣保證遍歷時後出現的牛的上界一定滿足小於等於前面的,這樣只需要判斷他的下界滿不滿足就行,這就想到了用樹狀陣列。
用樹狀陣列c[i]儲存到 i 前有多少牛的下界判斷過了。
這樣對每個牛先把他的下界加進去,再查有多少小於他的下界的牛,答案就是這個數-1(減他自己)
對於判斷s和e不同時相等有乙個好的辦法,就是新增完後先判斷當前區間是否和前乙個區間完全相同,如果相同就直接讓答案等於前乙個區間的。因為區間完全相同的一定排在一起且答案相同,這樣當第乙個加進去的時候此時除他自己以外沒有別的妞區間和他完全相同,按上面的演算法得到正確的答案,後面每乙個就複製他的答案即可。
本題範圍是從零開始,直接輸入0會在query時引起死迴圈,所以輸入時全部+1
**:
#include #include #include #include #define max 100010
using namespace std;
struct cow
}a[max];
int res[max];
bool cmp(cow a,cow b)
return res;
}int main()
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
else
}for(int i=1;i
POJ 2481 Cows 樹狀陣列
樹狀陣列 其實這題和 poj 2352 或者 就是道用樹狀陣列求逆序數的題目。先排序,我的排序是按照先s從小到大,如果s相等 e從大到小。貌似也沒什麼了。就樹狀陣列吧。include include include include include define inf 0x7fffffff defi...
poj 2481 Cows (樹狀陣列)
小記 之前沒做什麼修改之前,在poj上提交1393ms ac了。然後在hdu的web diy裡提交gnu c 超時了 於是不斷的改,在輸出的地方花費時間太多了。就是為了保證每兩個數之間有乙個空格,然後末尾沒有空格,我在for裡面加了乙個判斷,只要不是末尾就輸出乙個空格。然後就這樣超時了。樹狀陣列全用...
POJ2481 Cows 樹狀陣列
這題的意思是求區間覆蓋問題 si sj andej eiand ei si ej sj 求區間比當前區間大的個數。先按照s,e中的e從大到小排序,如果e相等,則按照s從小到大排序 聯想區間定義,右區間要大於當前值,左區間要小於當前值 滿足後用樹狀陣列乙個個插入求前面的個數即可 include inc...