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

 

你可能感兴趣的:(HDU)