省赛后有一周了,这一周过的很无聊,每天课也不想上,做题吧, 也没有状态,整天过的昏昏噩噩的。。

今天上午又没有去上课,在寝室没事了就想写道题。。

以前看过这道题,没怎么想,感觉就是线段树。今天再一看,只有100个矩形,数据量不是很大,离散化就可以搞定。

离散化+二分。。31msAC。

少加了一个初始化,悲剧了n次。

# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# define N 105
int col[N];
int X[2*N],Y[2*N],xs,ys,adj[2*N][2*N];
int cmp(const void *a,const void *b)
{
    return *(int *)a - *(int *)b;
}
int findx(int ans)
{
    int left,right,mid;
    left=1;
    right=xs;
    while(right>=left)
    {
        mid=(right+left)/2;
        if(X[mid]==ans) return mid;
        else if(X[mid] > ans) right=mid-1;
        else left=mid+1;
    }
}
int findy(int ans)
{
    int left,right,mid;
    left=1;
    right=ys;
    while(right>=left)
    {
        mid=(right+left)/2;
        if(Y[mid]==ans) return mid;
        else if(Y[mid]>ans) right=mid-1;
        else left=mid+1;
    }
}
int main()
{
    int i,j,stx,sty,edx,edy,H,W,num,ncase=0,count,k;
    int x1[N],y1[N],x2[N],y2[N],color[N];
    while(scanf("%d%d",&H,&W)!=EOF)
    {
        if(H==0 && W==0) break;
        scanf("%d",&num);
        ncase++;
        if(ncase!=1) printf("\n");
        k=0;
        for(i=1;i<=num;i++)
        {
            scanf("%d%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i],&color[i]);
            k++;
            X[k]=x1[i];
            Y[k]=y1[i];
            k++;
            X[k]=x2[i];
            Y[k]=y2[i];
        }
        qsort(X+1,k,sizeof(X[1]),cmp);
        qsort(Y+1,k,sizeof(Y[1]),cmp);
        xs=1;
        for(i=2;i<=k;i++)
        {
            if(X[i]!=X[i-1])
            {
                xs++;
                X[xs]=X[i];
            }
        }
        ys=1;
        for(i=2;i<=k;i++)
        {
            if(Y[i]!=Y[i-1])
            {
                ys++;
                Y[ys]=Y[i];
            }
        }
        memset(adj,0,sizeof(adj));
        for(i=1;i<=num;i++)
        {
            stx=findx(x1[i]);
            sty=findy(y1[i]);
            edx=findx(x2[i]);
            edy=findy(y2[i]);
            for(j=stx;j<edx;j++)
            {
                for(k=sty;k<edy;k++)
                {
                    adj[j][k]=color[i];
                }    
            }
        }
        memset(col,0,sizeof(col));
        for(i=1;i<xs;i++)
            for(j=1;j<ys;j++)
                col[adj[i][j]]+=(X[i+1]-X[i])*(Y[j+1]-Y[j]);
                printf("Case %d:\n",ncase);
                count=0;
        for(i=1;i<=100;i++)
            if(col[i]!=0) {printf("%d %d\n",i,col[i]);count++;}
            if(count==1||count==0) printf("There is %d color left on the wall.\n",count);
            else printf("There are %d colors left on the wall.\n",count);
    }
    return 0;
}
posted on 2011-05-30 13:39  奋斗青春  阅读(825)  评论(2编辑  收藏  举报