#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
using namespace std;
const int sz=50000;
typedef long long ll;
map<char,int>mp;
struct node
{
ll x,y1,y2,flag;
}l[sz];
ll sum[sz][1<<3];
ll cover[sz][4];
ll y[sz];
bool cmp(node a,node b)
{
return a.x<b.x;
}
void pushup(int id,int l,int r)
{
int s,i;
s=0;
for(i=1;i<=3;i++)
if(cover[id][i])
s|=1<<(i-1);
for(i=0;i<8;i++)
sum[id][i]=0;
if(l==r)
sum[id][s]=y[r+1]-y[l];
else
for(i=0;i<8;i++)
sum[id][s|i]+=sum[id<<1][i]+sum[id<<1|1][i];
}
void update(int a,int b,int co,int l,int r,int id)
{
if(a<=l&&r<=b)
{
if(co>0)
cover[id][co]++;
else
cover[id][-co]--;
pushup(id,l,r);
return ;
}
int mid=(l+r)>>1;
if(a<=mid)
update(a,b,co,l,mid,id<<1);
if(b>mid)
update(a,b,co,mid+1,r,id<<1|1);
pushup(id,l,r);
}
void build(int l,int r,int id)
{
int i;
for(i=1;i<=3;i++)
cover[id][i]=0;
for(i=1;i<8;i++)
sum[id][i]=0;
sum[id][0]=y[r+1]-y[l];
if(l==r)
return ;
int mid=(l+r)>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
}
int main()
{
char s[5];
ll x1,y1,x2,y2;
mp['R']=1;
mp['G']=2;
mp['B']=3;
int t,n,num=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int cnt=0;
while(n--)
{
scanf("%s %lld %lld %lld %lld",s,&x1,&y1,&x2,&y2);
l[cnt]={x1,y1,y2,mp[s[0]]};
y[cnt++]=y1;
l[cnt]={x2,y1,y2,-mp[s[0]]};
y[cnt++]=y2;
}
sort(y,y+cnt);
sort(l,l+cnt,cmp);
int m=unique(y,y+cnt)-y;
build(0,m-2,1);
ll ans[8]={0};
for(int i=0;i<cnt-1;i++)
{
int a=lower_bound(y,y+m,l[i].y1)-y;
int b=lower_bound(y,y+m,l[i].y2)-y-1;
update(a,b,l[i].flag,0,m-2,1);
for(int j=1;j<=7;j++)
ans[j]+=sum[1][j]*(l[i+1].x-l[i].x);
}
printf("Case %d:\n",num++);
printf("%lld\n%lld\n%lld\n%lld\n%lld\n%lld\n%lld\n",ans[1],ans[2],ans[4],ans[3],ans[5],ans[6],ans[7]);
}
}
Colourful Rectangle
最新推荐文章于 2020-07-18 22:49:53 发布