POJ 2481 Cows 樹狀陣列

2021-08-09 12:15:10 字數 1418 閱讀 4578

給你n個線段,讓你求每個線段被幾個線段覆蓋。

我們要對線段(x,y)進行處理。

我們按照y從大到小排序,如果相等,那麼x從小到大排序。

我們這樣排序的話,我們首先是可以忽略y了,後面出現的線段y一定是小於等於前面的。

也就是說只看x小於前面的幾個線段。

比如這組資料,4個線段。

3   5

2  4

1  3

2  3

2  6

首先排序

2    6

3   5

2   4

1   3

2   3

我們對於(2,6)

我們求2位置前面是否存在其他的點。不存在,也就是0. 之後我們讓2位置=1.

我們對於(3,5)

之後我們看3位置前面是否存在其他的點。存在乙個(前面設立的2位置那個點)。所以就是1 。之後我們讓3位置=1 。  為什麼存在呢。我們看的是當前線段是否被前面的線段覆蓋。我們按y排的序,所以y一定是小於等於前面的了。如果對於x前面存在小於等於x的值,那麼前面某個線段就完全覆蓋當前線段了。也就是符合條件的。

以此類推即可。

不過我們需要處理離散化問題,我們這裡就是如果排完序之後,列舉是,發現兩個x相同,y也相同,我們就不用計算了。直接把上乙個的值賦給這個即可,不要重新計算,這樣會導致算出來的值多1.因為我們把自己(上乙個,和自己一樣嘛)也計算進去了。

#include

#include

#include

#include

using namespace std;

const int maxn=100010;

int c[maxn];

struct node

node[maxn];

int n;

int cnt[maxn];//記錄結果

//先按照e從大到小排序,e相同則按照s從小到大排序

bool cmp(node a,node b)

int lowbit(int x)

void add(int i,int val)

}int sum(int i)

return s;

}int main()

sort(node+1,node+n+1,cmp);

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

memset(cnt,0,sizeof(cnt));

cnt[node[1].index]=0;

add(node[1].s+1,1);

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

printf("%d",cnt[1]);

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

printf(" %d",cnt[i]);

printf("\n");

}return 0;

}

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裡面加了乙個判斷,只要不是末尾就輸出乙個空格。然後就這樣超時了。樹狀陣列全用...

poj 2481 Cows(樹狀陣列)

題意 山坡上長滿三葉草,給定一群牛和他們喜愛的範圍 s,ei 如果一頭牛的s小於等於另一頭牛而e大於等於另一頭牛的,且s和e不同時相等,那麼這頭牛就比另一頭牛強壯。可以先對e從大到小排序,這樣保證遍歷時後出現的牛的上界一定滿足小於等於前面的,這樣只需要判斷他的下界滿不滿足就行,這就想到了用樹狀陣列。...