Draw a Mess ZOJ
阿新 • • 發佈:2018-12-18
正向考慮複雜度感人 那就逆向考慮 著過色的點之後就不再動了 每一行開個並查集優化一下就行 就是這幾種圖案分情況討論要仔細點
#include <bits/stdc++.h> 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; }