http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3544
正向考虑复杂度感人 那就逆向考虑 着过色的点之后就不再动了 每一行开个并查集优化一下就行 就是这几种图案分情况讨论要仔细点
using namespace std;
const int maxn=2e2+10;
const int maxm=5e4+10;
const int maxq=5e4+10;
struct node
{
char tp[20];
int xc,yc,r,l,w,c;
};
node order[maxq];
int book[maxn][maxm],nxt[maxn][maxm];
int ans[10];
int n,m,q;
int getf(int *f,int p)
{
if(f[p]==p) return p;
else return f[p]=getf(f,f[p]);
}
void unite(int *f,int u,int v)
{
int fu,fv;
fu=getf(f,u),fv=getf(f,v);
if(fu!=fv) f[fv]=fu;
}
void paint(int x,int pl,int pr,int c)
{
int t;
while(pl<=pr){
if(!book[x][pl]) book[x][pl]=c;
t=pl;
pl=getf(nxt[x],pl)+1;
unite(nxt[x],pr,t);
}
}
void solve()
{
int x,y;
memset(ans,0,sizeof(ans));
for(x=1;x<=n;x++){
for(y=1;y<=m;y++){
ans[book[x][y]]++;
}
}
}
int main()
{
int i,x,y,pl,pr,c;
while(scanf("%d%d%d",&n,&m,&q)!=EOF){
for(x=0;x<=n;x++){
for(y=0;y<=m;y++){
book[x][y]=0,nxt[x][y]=y;
}
}
for(i=1;i<=q;i++){
scanf("%s",order[i].tp);
if(order[i].tp[0]=='C'){
scanf("%d%d%d%d",&order[i].xc,&order[i].yc,&order[i].r,&order[i].c);
order[i].xc++,order[i].yc++;
}
else if(order[i].tp[0]=='D'){
scanf("%d%d%d%d",&order[i].xc,&order[i].yc,&order[i].r,&order[i].c);
order[i].xc++,order[i].yc++;
}
else if(order[i].tp[0]=='R'){
scanf("%d%d%d%d%d",&order[i].xc,&order[i].yc,&order[i].l,&order[i].w,&order[i].c);
order[i].xc++,order[i].yc++;
}
else{
scanf("%d%d%d%d",&order[i].xc,&order[i].yc,&order[i].w,&order[i].c);
order[i].xc++,order[i].yc++;
}
}
for(i=q;i>=1;i--){
//printf("***%d***\n",i);
if(order[i].tp[0]=='C'){
for(x=max(1,order[i].xc-order[i].r);x<=min(n,order[i].xc+order[i].r);x++){
c=(order[i].xc-x)*(order[i].xc-x);
pl=order[i].yc-sqrt(order[i].r*order[i].r-c),pr=order[i].yc+sqrt(order[i].r*order[i].r-c);
if(c+(order[i].yc-pl)*(order[i].yc-pl)>order[i].r*order[i].r) pl++;
if(c+(order[i].yc-(pr+1))*(order[i].yc-(pr+1))<=order[i].r*order[i].r) pr++;
paint(x,max(1,pl),min(m,pr),order[i].c);
}
}
else if(order[i].tp[0]=='D'){
for(x=max(1,order[i].xc-order[i].r);x<=min(n,order[i].xc+order[i].r);x++){
c=abs(order[i].xc-x);
pl=order[i].yc-(order[i].r-c),pr=order[i].yc+(order[i].r-c);
paint(x,max(1,pl),min(m,pr),order[i].c);
}
}
else if(order[i].tp[0]=='R'){
for(x=order[i].xc;x<=min(n,order[i].xc+order[i].l-1);x++){
pl=order[i].yc,pr=order[i].yc+order[i].w-1;
paint(x,max(1,pl),min(m,pr),order[i].c);
}
}
else{
for(x=order[i].xc;x<=min(n,order[i].xc+(order[i].w+1)/2-1);x++){
pl=order[i].yc-(order[i].w+1)/2+1+(x-order[i].xc);
pr=order[i].yc+(order[i].w+1)/2-1-(x-order[i].xc);
paint(x,max(1,pl),min(m,pr),order[i].c);
}
}
}
solve();
for(i=1;i<=9;i++){
printf("%d",ans[i]);
if(i<9) printf(" ");
else printf("\n");
}
}
return 0;
}