省赛后有一周了,这一周过的很无聊,每天课也不想上,做题吧, 也没有状态,整天过的昏昏噩噩的。。
今天上午又没有去上课,在寝室没事了就想写道题。。
以前看过这道题,没怎么想,感觉就是线段树。今天再一看,只有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;
}
浙公网安备 33010602011771号