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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj2464扫描线好题,树状数组解法

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj2464扫描线好题,树状数组解法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用樹狀數組解比線段樹快了好多,難度也下降許多

分別用兩個樹狀數組維護當前掃描線左側和右側的點,離散化y軸即可

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define maxn 200005 struct node{int x,y;bool operator<(const node p)const {return x<p.x;} }p[maxn]; int y[maxn],cnt,n; int l[maxn],r[maxn];//兩個樹狀數組維護掃描線左邊的點數,右邊的點數 void add(int *bit,int x,int num){for(int i=x;i<=cnt+5;i+=i&-i)bit[i]+=num; } int sum(int *bit,int x){int res=0;for(int i=x;i;i-=i&-i)res+=bit[i];return res; }int main(){while(scanf("%d",&n),n){memset(l,0,sizeof l);memset(r,0,sizeof r);for(int i=0;i<n;i++){scanf("%d%d",&p[i].x,&p[i].y);y[i]=p[i].y;}sort(p,p+n);sort(y,y+n);cnt=unique(y,y+n)-y;//離散化y軸 for(int i=0;i<n;i++)add(r,lower_bound(y,y+cnt,p[i].y)-y+1,1);int Stan=-1,st=0;vector<int>Ollie;for(int i=1;i<=n;i++){if(i==n || p[i].x!=p[i-1].x){//一條豎線上的點統一處理 for(int j=st;j<i;j++)add(r,lower_bound(y,y+cnt,p[j].y)-y+1,-1);//把這條線上的點從r數組刪去 int stan=-1,ollie=-1;for(int j=st;j<i;j++){int pos=lower_bound(y,y+cnt,p[j].y)-y+1;int a=sum(r,cnt)-sum(r,pos)+sum(l,pos-1);int b=sum(l,cnt)-sum(l,pos)+sum(r,pos-1);if(b==ollie) stan=min(stan,a);//使stan得分最小化 else if(b>ollie) stan=a,ollie=b;//使Ollie得分最大化 }if(stan>Stan){Stan=stan;Ollie.clear();}//stan得分更新后同時跟新Ollie得分 if(stan==Stan)Ollie.push_back(ollie);for(int j=st;j<i;j++)//最后把這條線上的點加入l數組 add(l,lower_bound(y,y+cnt,p[j].y)-y+1,1);st=i;}}printf("Stan: %d; Ollie:",Stan);sort(Ollie.begin(), Ollie.end());cnt=unique(Ollie.begin(), Ollie.end())-Ollie.begin();for(int i=0;i<cnt;i++) printf(" %d",Ollie[i]);puts(";");}return 0; }

?

轉載于:https://www.cnblogs.com/zsben991126/p/10115082.html

總結

以上是生活随笔為你收集整理的poj2464扫描线好题,树状数组解法的全部內容,希望文章能夠幫你解決所遇到的問題。

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