首页 > 代码库 > hdu 4419 Colourful Rectangle

hdu 4419 Colourful Rectangle

http://acm.hdu.edu.cn/showproblem.php?pid=4419

题意:给出3种颜色,重叠会生成新的颜色,然后有一些矩形,求出每种颜色的面积。

转化为二进制表示颜色:001 R ,010G,100B,011RG,101RB,....111RGB;

在结构体里面加上一个len[8]和cover[8]表示每种颜色所占的长度和在区间的覆盖次数。

  1 #include <cstdio>  2 #include <cstring>  3 #include <algorithm>  4 #define maxn 100010  5 #define ll __int64  6 using namespace std;  7   8 int t,n;  9 char ch; 10 ll Y[maxn]; 11 struct node1 12 { 13     ll x,y1,y2; 14     int lr,c; 15     bool operator <(const node1 &a)const 16     { 17         return (x<a.x)||(x==a.x&&lr>a.lr); 18     } 19 }p[maxn]; 20 struct node 21 { 22     int l,r; 23     ll len[8]; 24     int cover[8]; 25 } tree[maxn*4]; 26  27 void build(int i,int l,int r) 28 { 29     tree[i].l=l; 30     tree[i].r=r; 31     for(int j=1; j<8; j++) 32     { 33         tree[i].cover[j]=tree[i].len[j]=0; 34     } 35     if(l==r-1) return; 36     int mid=(l+r)>>1; 37     build(i<<1,l,mid); 38     build(i<<1|1,mid,r); 39 } 40  41 void update(int i,int l,int r,int lr,int c) 42 { 43     if(tree[i].l==l&&tree[i].r==r) 44     { 45         tree[i].cover[c]+=lr; 46         if(tree[i].cover[c]) 47             tree[i].len[c]=Y[tree[i].r]-Y[tree[i].l]; 48         else if(tree[i].r-1==tree[i].l) 49             tree[i].len[c]=0; 50         else 51             tree[i].len[c]=tree[i<<1].len[c]+tree[i<<1|1].len[c]; 52         return ; 53     } 54     int mid=(tree[i].r+tree[i].l)>>1; 55     if(r<=mid) 56     { 57         update(i<<1,l,r,lr,c); 58     } 59     else if(l>=mid) 60     { 61         update(i<<1|1,l,r,lr,c); 62     } 63     else 64     { 65         update(i<<1,l,mid,lr,c); 66         update(i<<1|1,mid,r,lr,c); 67     } 68     if(tree[i].cover[c]) 69         tree[i].len[c]=Y[tree[i].r]-Y[tree[i].l]; 70     else if(tree[i].r-1==tree[i].l) 71         tree[i].len[c]=0; 72     else 73         tree[i].len[c]=tree[i<<1].len[c]+tree[i<<1|1].len[c]; 74 } 75  76 int main() 77 { 78     scanf("%d",&t); 79     int cas=1; 80     while(t--) 81     { 82         scanf("%d",&n); 83         getchar(); 84         int t1=0; 85         for(int i=1; i<=n; i++) 86         { 87             ll x1,y1,x2,y2; 88             scanf("%c %I64d%I64d%I64d%I64d",&ch,&x1,&y1,&x2,&y2); 89             if(ch==R) 90             { 91                 p[t1].c=1; p[t1+1].c=1; 92             } 93             else if(ch==G) 94             { 95                 p[t1].c=2; p[t1+1].c=2; 96             } 97             else if(ch==B) 98             { 99                 p[t1].c=4; p[t1+1].c=4;100             }101             p[t1].x=x1; p[t1].y1=y1; p[t1].y2=y2;p[t1].lr=1;Y[t1++]=y1;102             p[t1].x=x2; p[t1].y1=y1; p[t1].y2=y2;p[t1].lr=-1;Y[t1++]=y2;103             getchar();104         }105         sort(Y,Y+t1);106         int cnt=unique(Y,Y+t1)-Y;107         sort(p,p+t1);108         build(1,0,cnt-1);109         ll s[maxn]={0};110         for(int i=0; i<t1; i++)111         {112             int l1=lower_bound(Y,Y+cnt,p[i].y1)-Y;113             int rr=lower_bound(Y,Y+cnt,p[i].y2)-Y;114             for(int j=1; j<8; j++)115             {116                 if(p[i].c&j) update(1,l1,rr,p[i].lr,j);117                 if(i+1<t1) s[j]+=tree[1].len[j]*(p[i+1].x-p[i].x);118             }119         }120         printf("Case %d:\n",cas);121         cas++;122         printf("%I64d\n",s[7]-s[6]);123         printf("%I64d\n",s[7]-s[5]);124         printf("%I64d\n",s[7]-s[3]);125         printf("%I64d\n",s[5]+s[6]-s[4]-s[7]);126         printf("%I64d\n",s[3]+s[6]-s[2]-s[7]);127         printf("%I64d\n",s[3]+s[5]-s[1]-s[7]);128         printf("%I64d\n",s[1]+s[2]+s[4]-s[3]-s[5]-s[6]+s[7]);129     }130     return 0;131 }
View Code