poj 1177 picture 线段树
来源:互联网 发布:手机能开通淘宝店吗 编辑:程序博客网 时间:2024/05/25 20:01
调了两天。。。最后那天晚上线段树按[1,2)写的很容易就对了。。
/*ID:autoacd1PROG:pictureLANG:C++*/#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#define MAX 21000#include<cmath>using namespace std;struct wbysr{int x1,y1,x2,y2,d;}x[10000+4],y[10000+4];int n,i,ans_x=0,ans_y=0,ori=0;int l[4*MAX],r[4*MAX],f[4*MAX],len[4*MAX];bool cmp_x(wbysr a1,wbysr a2){return (a1.y1>a2.y1)||(a1.y1==a2.y1&&a1.d>a2.d);}bool cmp_y(wbysr a1,wbysr a2){return(a1.x1>a2.x1)||(a1.x1==a2.x1&&a1.d>a2.d);}void build(int x,int la,int ra){l[x]=la;r[x]=ra;f[x]=0;len[x]=0;if(la==ra-1) return;int mid=(la+ra)/2;build(2*x,la,mid);build(2*x+1,mid,ra);}void insert(int x,int la,int ra,int num){ if(ra<=l[x]||la>=r[x]) return;if(l[x]>=la&&r[x]<=ra&&f[x]+num>=0) { f[x]+=num; if(f[x]>0) len[x]=r[x]-l[x];else { if(l[x]<r[x]-1) len[x]=len[2*x]+len[2*x+1]; else len[x]=0; } return; }f[2*x]+=f[x];f[2*x+1]+=f[x];f[x]=0;if(f[2*x]) len[2*x]=r[2*x]-l[2*x];/*else { if(l[2*x]<r[2*x]-1) len[2*x]=len[2*2*x]+len[2*(2*x)+1]; else len[2*x]=0; }*/if(f[2*x+1]) len[2*x+1]=r[2*x+1]-l[2*x+1];/*else { if(l[2*x+1]<r[2*x+1]-1) len[2*x+1]=len[2*(2*x+1)]+len[2*(2*x+1)+1]; else len[(2*x+1)]=0; }*/insert(2*x,la,ra,num);insert(2*x+1,la,ra,num);if(f[x]) len[x]=r[x]-l[x];else len[x]=len[2*x]+len[2*x+1];return;}int main(){ { //freopen("1.out","w",stdout);// freopen("picture.in","r",stdin); // freopen("picture.out","w",stdout); cin>>n;for(i=1;i<=2*n;i+=2) { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); ///* x1+=10005; x2+=10005; y2+=10005; y1+=10005; // */ //x x[i].x1=x1; x[i].y1=y1; x[i].x2=x2;x[i].y2=y1; x[i].d=-1; i++; x[i].x1=x1; x[i].y1=y2; x[i].x2=x2;x[i].y2=y2; x[i].d=1; //y i--; y[i].x1=x1; y[i].y1=y1; y[i].x2=x1;y[i].y2=y2; y[i].d=-1; i++; y[i].x1=x2; y[i].y1=y1; y[i].x2=x2;y[i].y2=y2; y[i].d=1; i--; }//x!!! sort(x+1,x+1+n+n,cmp_x); build(1,1,MAX+4); for(i=1;i<=2*n;i++) { //cout<<"-------------------------------------------"<<i<<endl; insert(1,x[i].x1,x[i].x2,x[i].d); if(x[i].y1!=x[i+1].y1||x[i].d!=x[i+1].d) { ans_x+=abs(len[1]-ori); ori=len[1]; } // cout<<"___"<<x[i].x1<<' '<<x[i].x2<<' '<<x[i].d<<' '<<len[1]<<' '<<ans_x<<endl; /* cout<<"-________________________________"<<endl; for(int j=1;j<=136;j++) cout<<j<<" "<<l[j]<<" "<<r[j]<<" "<<len[j]<<" "<<f[j]<<endl; // */ } // cout<<"_____"<<ans_x<<endl; //y!!! memset(l,0,sizeof(l));memset(r,0,sizeof(r));memset(f,0,sizeof(f));memset(len,0,sizeof(len)); sort(y+1,y+1+n+n,cmp_y); build(1,1,MAX+4); for(i=1;i<=2*n;i++) { //cout<<"-------------------------------------------"<<i<<endl; insert(1,y[i].y1,y[i].y2,y[i].d); if(y[i].x1!=y[i+1].x1||y[i].d!=y[i+1].d) { ans_y+=abs(len[1]-ori); ori=len[1]; } // cout<<"_____"<<y[i].y1<<' '<<y[i].y2<<' '<<y[i].d<<' '<<len[1]<<' '<<ans_y<<endl; /* cout<<"-________________________________"<<endl; for(int j=1;j<=49;j++) cout<<j<<" "<<l[j]<<" "<<r[j]<<" "<<len[j]<<" "<<f[j]<<endl; */ } // cout<<"_____"<<ans_y<<endl; cout<<ans_x+ans_y<<endl; } return 0;}
- poj 1177 picture 线段树
- POJ 1177 Picture (线段树扫描线)
- poj 1171 Picture 线段树
- poj 1177 Picture 线段树+离散化+线扫描
- poj 1177 & hdu 1828 Picture(线段树+离散化)
- poj 1177 Picture(线段树求矩形周长并)
- poj 1177 Picture(线段树+离散化+…
- POJ 1177 Picture (线段树+离散化+扫描线) 详解
- picture 1177 poj 线段树+扫描线+离散化
- poj - 1177 - Picture(离线化+扫描线+线段树)
- poj 1177 Picture(线段树+矩形周长并)
- 【线段树+扫描线】 HDOJ 1828 && POJ 1177 Picture
- POJ 1177 Picture [离散化+扫描线+线段树]
- POJ - 1177 Picture(线段树 扫描线 区间合并)
- POJ 1177 Picture(线段树+扫描线)
- poj 1177 Picture 【线段树 扫描线 求轮廓周长】
- POJ 1177 Picture(线段树+离散化 求周长)
- POJ 1177:Picture(线段树-扫描线)
- alsa音频架构1
- 【四圣龙神录的编程教室】第10章、把敌人表示出来看看吧
- ThinkPHP URL路由解析
- apue 1 课后习题
- CodeForces 366 E. Dima and Magic Guitar
- poj 1177 picture 线段树
- 推荐Linux新手应该访问的5个国外网站:
- CreateToolHelp32Snapshot函数获取系统快照
- acm--成绩处理
- Android VSync信号产生过程源码分析
- android 如何退出整个系统
- 静态方法和非静态方法的调用
- 并发编程之交换器Exchanger
- HTML相关