HDU4419 Colourful Rectangle


题意:

  给你n个矩形,每个矩形是R、G、B三种颜色中的一种,三种颜色的混合可以得到7种颜色分别为R, G, B, RG, RB, GB, RGB。求每种颜色的面积。

线段树,各种不会

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define lson l,mid,rt<<1
 6 #define rson mid,r,rt<<1|1 //注意mid
 7 using namespace std;
 8 const int Ni = 10010;
 9 struct node{
10     int x1,x2,h,c;
11     bool operator < (const node &a) const {
12         return h<a.h;
13     }
14 }seg[Ni*2];
15 int x[Ni*2],tem[8];
16 int len[Ni*7][8];//记录每种颜色的长度
17 int col[Ni*7][4];//记录每颜色出现的次数
18 long long ans[8];
19 int n,m,ql,qr,cl;
20 int ot[]={1,2,4,3,5,6,7};
21 void build()
22 {
23     memset(len,0,sizeof(len));
24     memset(col,0,sizeof(col));
25     memset(ans,0,sizeof(ans));
26 }
27 void update(int l=0,int r=m,int rt=1)
28 {
29     if(ql<=x[l]&&x[r]<=qr) cl>0? col[rt][cl]++:col[rt][-cl]--;
30     else{
31         int mid=(l+r)>>1;
32         if(ql<x[mid]) update(lson);
33         if(qr>x[mid]) update(rson);
34     }
35     int i,c=(col[rt][1]>0)|((col[rt][2]>0)<<1)|((col[rt][3]>0)<<2);
36     for(i=1;i<8;i++) len[rt][i]=0;
37     len[rt][c]=x[r]-x[l];
38     for(i=1;i<8;i++) if(i!=c)
39     {
40         int tmp=len[rt<<1][i]+len[rt<<1|1][i];
41         len[rt][i|c]+=tmp;
42         len[rt][c]-=tmp;
43     }
44 }
45 int main()
46 {
47     int T,cs=1,c,i,j;
48     char str[5];
49     scanf("%d",&T);
50     while(T--)
51     {
52         scanf("%d",&n);
53         for(i=0;i<n;i++)
54         {
55             scanf("%s%d%d%d%d",str,x+i,&seg[i].h,x+i+n,&seg[i+n].h);
56             if(str[0]=='R') c=1;
57             else if(str[0]=='G') c=2;
58             else c=3;
59             seg[i].x1=x[i];seg[i].x2=x[i+n];seg[i].c=c;
60             seg[i+n].x1=x[i];seg[i+n].x2=x[i+n];seg[i+n].c=-c;
61         }
62         sort(x,x+n+n);
63         sort(seg,seg+n+n);
64         build();n+=n;
65         for(m=i=0;i<n;i++) if(x[i]!=x[m]) x[++m]=x[i];
66         for(n--,i=0;i<n;i++)
67         {
68             ql=seg[i].x1;qr=seg[i].x2;cl=seg[i].c;
69             update();
70             for(j=1;j<8;j++)
71                 ans[j]+=(long long)(seg[i+1].h-seg[i].h)*len[1][j];
72         }
73         printf("Case %d:\n",cs++);
74         for(i=0;i<7;i++)
75             printf("%I64d\n",ans[ot[i]]);
76     }
77     return 0;
78 }

 

 

posted @ 2012-09-25 14:19  qijinbiao1  阅读(385)  评论(0编辑  收藏  举报