1. 程式人生 > >Draw a Mess ZOJ

Draw a Mess ZOJ

正向考慮複雜度感人 那就逆向考慮 著過色的點之後就不再動了 每一行開個並查集優化一下就行 就是這幾種圖案分情況討論要仔細點

#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;
}