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 }

 

 

你可能感兴趣的:(HDU)