日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ2481-Cows【树状数组】

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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【树状数组】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。