POJ2481-Cows【树状数组】
生活随笔
收集整理的這篇文章主要介紹了
POJ2481-Cows【树状数组】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:
http://poj.org/problem?id=2481
題目大意
給出若干個區間[Si,Ei],定義一個區間比另一個區間“strong”當且僅當Si<=Sj and Ei>=Ej and Ei-Si>Ej-Sj。輸出對于每一個區間,有多少個區間比它strong。區間最多100000個,區間坐標不超過100000。
解題思路
將e從大到小排序,如果e等于就將s從小到大排序。然后用樹狀數組表示Si==x的數量,然后每次因為e是降序所有只有可能strong與i比其大的牛,然后在s和e都相等的情況下特殊處理就好了。
代碼
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct co{int num,s,e,w; }cow[100001]; int c[100001],n,maxs; int lowbit(int x) {return x&(-x);} void change(int x,int num)//改變 {int i=x;while(i<=maxs){c[i]+=num;i+=lowbit(i);} } int getsum(int x)//求和 {int sum=0;while (x>0){sum+=c[x];x-=lowbit(x);}return sum; } bool cmp(co x,co y)//排序 {if (x.e==y.e) return x.s<y.s;return x.e>y.e; } bool cmp2(co x,co y)//排序回來 {return x.num<y.num; } int main() {while(true){scanf("%d",&n);if (!n) break;memset(c,0,sizeof(c));for (int i=1;i<=n;i++){scanf("%d%d",&cow[i].s,&cow[i].e);maxs=max(maxs,cow[i].e);cow[i].num=i;}sort(cow+1,cow+1+n,cmp);//排序int last=0,k=0;for (int i=1;i<=n;i++){if (i!=1&&cow[i].e==cow[i-1].e&&cow[i].s==cow[i-1].s){cow[i].w=cow[i-1].w;change(cow[i].s+1,1);//相等就直接賦值為上一個}else{cow[i].w=getsum(cow[i].s+1);change(cow[i].s+1,1);//插入}}sort(cow+1,cow+1+n,cmp2);for (int i=1;i<=n;i++)printf("%d ",cow[i].w);printf("\n");} }總結
以上是生活随笔為你收集整理的POJ2481-Cows【树状数组】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云要给所有中国高校在读大学生每人送一
- 下一篇: RISC-V 领军企业 SiFive 谈