Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
线段树的话排序的时候把入边排在出边的前面,重边就过了RT 能处理DISCUSS里的所有重边数据 另外HDU那道题依旧没有重边。。我改错了代码,把不判重的数据交上去发现AC了 #include<stdio.h> #include<string.h> #include<stdlib.h> #define c(a) memset(a,0,sizeof a) #define ls tree[p].lson #define rs tree[p].rson struct abcd{int x,y,f,lson,rson;}tree[40100];int tot; struct abcde{int no,l,r,f;}linex[10100],liney[10100],toadd; int n,ans; int cmp(const void *x,const void *y) { struct abcde *xx=(struct abcde*)x; struct abcde *yy=(struct abcde*)y; if(xx->no==yy->no)return yy->f-xx->f; return xx->no-yy->no; } void Build_tree(int p,int x,int y) { int mid=x+y>>1; tree[p].x=x;tree[p].y=y; if(x+1==y)return ; ls=++tot; rs=++tot; Build_tree(ls,x,mid); Build_tree(rs,mid,y); } void add(int p) { int mid=tree[p].x+tree[p].y>>1; if(tree[p].x>=toadd.l&&tree[p].y<=toadd.r&&tree[p].f>=0) { if(!tree[p].f)ans+=tree[p].y-tree[p].x; tree[p].f+=toadd.f; if(!tree[p].f)ans+=tree[p].y-tree[p].x; return ; } if(tree[p].f>=0)tree[ls].f+=tree[p].f,tree[rs].f+=tree[p].f,tree[p].f=-1; if(toadd.r<=mid)add(ls); else if(toadd.l>=mid)add(rs); else add(ls),add(rs); if(tree[ls].f==tree[rs].f&&tree[ls].f>=0)tree[p].f=tree[ls].f,tree[ls].f=tree[rs].f=0; } int main() { int i,x1,x2,y1,y2; while(~scanf("%d",&n)) { c(tree);tot=0;ans=0; for(i=1;i<=n;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1+=10000;x2+=10000;y1+=10000;y2+=10000; linex[i+i-1].no=y1; linex[i+i-1].l=x1; linex[i+i-1].r=x2; linex[i+i-1].f=1; linex[i<<1].no=y2; linex[i<<1].l=x1; linex[i<<1].r=x2; linex[i<<1].f=-1; liney[i+i-1].no=x1; liney[i+i-1].l=y1; liney[i+i-1].r=y2; liney[i+i-1].f=1; liney[i<<1].no=x2; liney[i<<1].l=y1; liney[i<<1].r=y2; liney[i<<1].f=-1; } n<<=1; Build_tree(0,0,20000); qsort(linex+1,n,sizeof linex[0],cmp); qsort(liney+1,n,sizeof liney[0],cmp); for(i=1;i<=n;i++) toadd=linex[i], add(0); memset(tree,0,sizeof tree);tot=0; Build_tree(0,0,20000); for(i=1;i<=n;i++) toadd=liney[i], add(0); printf("%d\n",ans); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator