题意:
给你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 }