sgu Kalevich Strikes Back

这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含。。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <vector>
  4 #include <algorithm>
  5 #define maxn 120100
  6 using namespace std;
  7 
  8 long long s[maxn];
  9 vector<int>g[maxn];
 10 int pre[maxn];
 11 int X[maxn];
 12 int n,m,w,h,x1,y1,x2,y2;
 13 struct node
 14 {
 15     int l,r;
 16     int ll,rr;
 17     int cover;
 18 }tree[maxn*4];
 19 
 20 struct line
 21 {
 22     int y,x1,x2,lr;
 23     bool operator <(const line &a)const
 24     {
 25         return y<a.y;
 26     }
 27 }p[maxn];
 28 
 29 void build(int i,int l,int r)
 30 {
 31     tree[i].l=l;
 32     tree[i].r=r;
 33     tree[i].ll=X[l];
 34     tree[i].rr=X[r];
 35     tree[i].cover=0;
 36     if(r-l==1) return ;
 37     int mid=(l+r)>>1;
 38     build(i<<1,l,mid);
 39     build(i<<1|1,mid,r);
 40 }
 41 void down(int i)
 42 {
 43     if(tree[i].l+1==tree[i].r) return;
 44     if(tree[i].cover!=-1)
 45     {
 46         tree[i<<1].cover=tree[i<<1|1].cover=tree[i].cover;
 47         tree[i].cover=-1;
 48     }
 49 }
 50 void update(int i, line a)
 51 {
 52     if(tree[i].ll==a.x1&&tree[i].rr==a.x2)
 53     {
 54         if(a.lr>0)
 55             tree[i].cover=a.lr;
 56         else
 57             tree[i].cover=pre[-a.lr];
 58         return ;
 59     }
 60     down(i);
 61     if(a.x2<=tree[i<<1].rr) update(i<<1,a);
 62     else if(a.x1>=tree[i<<1|1].ll) update(i<<1|1,a);
 63     else
 64     {
 65         line tmp=a;
 66         tmp.x2=tree[i<<1].rr;
 67         update(i<<1,tmp);
 68         tmp=a;
 69         tmp.x1=tree[i<<1|1].ll;
 70         update(i<<1|1,tmp);
 71     }
 72 }
 73 
 74 int search1(int i,line m)
 75 {
 76     if(tree[i].cover!=-1)
 77     {
 78         return tree[i].cover;
 79     }
 80     if(m.x2<=tree[i<<1].rr) return search1(i<<1,m);
 81     else if(m.x1>=tree[i<<1|1].ll) return search1(i<<1|1,m);
 82     else
 83     {
 84         line tmp;
 85         tmp=m;
 86         tmp.x2=tree[i<<1].rr;
 87         return search1(i<<1,tmp);
 88     }
 89 }
 90 void dfs(int u)
 91 {
 92     for(int i=0; i<(int)g[u].size(); i++)
 93     {
 94         int v=g[u][i];
 95         s[u]-=s[v];
 96         dfs(v);
 97     }
 98 }
 99 
100 int main()
101 {
102     while(scanf("%d",&n)!=EOF)
103     {
104         for(int i=0; i<=n; i++)
105         {
106             g[i].clear();
107         }
108         scanf("%d%d",&w,&h);
109         s[0]=(long long)w*h;
110         int t1=0;
111         for(int i=1; i<=n; i++)
112         {
113             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
114             if(x1>x2)swap(x1,x2);
115             if(y1>y2)swap(y1,y2);
116             s[i]=(long long)(x2-x1)*(y2-y1);
117             p[t1].y=y1;
118             p[t1].x1=x1;
119             p[t1].x2=x2;
120             p[t1].lr=i;
121             X[t1++]=x1;
122             p[t1].y=y2;
123             p[t1].x1=x1;
124             p[t1].x2=x2;
125             p[t1].lr=-i;
126             X[t1++]=x2;
127         }
128         sort(X,X+t1);
129         t1=unique(X,X+t1)-X;
130         build(1,0,t1-1);
131         sort(p,p+2*n);
132         for(int i=0; i<2*n; i++)
133         {
134             if(p[i].lr>0)
135             {
136                 pre[p[i].lr]=search1(1,p[i]);
137                 g[pre[p[i].lr]].push_back(p[i].lr);
138             }
139             update(1,p[i]);
140         }
141         dfs(0);
142         sort(s,s+n+1);
143         for(int i=0; i<=n; i++)
144         {
145             if(i==n) printf("%I64d\n",s[i]);
146             else printf("%I64d ",s[i]);
147         }
148     }
149     return 0;
150 }
View Code

 

posted @ 2014-08-08 18:50  null1019  阅读(171)  评论(0编辑  收藏  举报