Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 607 Accepted Submission(s): 208
(0,0) (0,W)
---------------
| |
| |
| |
| |
| |
---------------
(H,0) (H,W)
//直接离散化处理 46Ms #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define N 102 struct node { int x1,y1,x2,y2,color; }rct[N]; //储存矩形 int x[N<<1],y[N<<1],yhash[10002]; yhash[i]代表y坐标为i的y在离散化后数组中的位置 int hash[N<<1],rc[N]; rc用来加点速度 int area[N]; int main() { int h,w,T=0; int n,nn,yid,rcid; int i,j; while(scanf("%d %d",&h,&w),h|w) { memset(rc,0,sizeof(rc)); memset(area,0,sizeof(area)); scanf("%d",&n); for(j=i=0;i<n;i++) { scanf("%d %d %d %d %d",&rct[i].x1,&rct[i].y1,&rct[i].x2,&rct[i].y2,&rct[i].color); rc[rct[i].color]=1; x[j]=rct[i].x1; y[j]=rct[i].y1; j++; x[j]=rct[i].x2; y[j]=rct[i].y2; j++; } nn=n<<1; sort(x,x+nn); sort(y,y+nn); rcid=0; for(i=0;i<N;i++) if(rc[i]) rc[rcid++]=i; yid=0;yhash[y[0]]=0; for(i=1;i<nn;i++)//离散化 if(y[i]!=y[i-1]) { y[++yid]=y[i]; yhash[y[i]]=yid; } for(i=1;i<nn;i++) { if(x[i]==x[i-1]) continue; for(j=0;j<n;j++)//判断哪个矩形适用该坐标区间 if(rct[j].x1<=x[i-1]&&rct[j].x2>=x[i]) { for(int k=yhash[rct[j].y1];y[k]<rct[j].y2;k++) hash[k]=rct[j].color; } for(j=0;j<yid;j++) if(hash[j]) { area[hash[j]]+=(x[i]-x[i-1])*(y[j+1]-y[j]); hash[j]=0; } } if(T) printf("\n"); printf("Case %d:\n",++T); for(j=0,i=0;i<rcid;i++) if(area[rc[i]]) { j++; printf("%d %d\n",rc[i],area[rc[i]]); } if(j<=1) printf("There is %d color left on the wall.\n",j); else printf("There are %d colors left on the wall.\n",j); } return 0; } //离散化再线段树 93Ms ,估计数据太小,没体现出来优势、 #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define N 102 #define lson l,m,k<<1 #define rson m,r,k<<1|1 struct node { int x1,y1,x2,y2,color; }rct[N]; int color[N<<5]; int x[N<<1],y[N<<1]; int rc[N]; int area[N]; /*void build(int l,int r,int k) { color[k]=-1;//这里写-1是错滴、、-1代表杂色,开始啥也没,哪来杂色、要是写0倒可以 if(l+1==r) return ; int m=(l+r)>>1; build(lson); build(rson); }*/ void down(int &k) { color[k<<1]=color[k]; color[k<<1|1]=color[k]; color[k]=-1; } int flag; void update(int &y1,int &y2,int l,int r,int k) { if(y1<=y[l]&&y2>=y[r]) { color[k]=flag; return ; } if(color[k]!=-1) down(k); int m=(l+r)>>1; if(y1<y[m]) update(y1,y2,lson); if(y2>y[m]) update(y1,y2,rson); } int differ; void query(int l,int r,int k) { if(color[k]!=-1) { color[k]?area[color[k]]+=differ*(y[r]-y[l]):1; return ; } int m=(l+r)>>1; query(lson); query(rson); } int main() { int h,w,T=0; int n,nn,yid,rcid; int i,j; while(scanf("%d %d",&h,&w),h|w) { memset(rc,0,sizeof(rc)); memset(area,0,sizeof(area)); scanf("%d",&n); for(j=i=0;i<n;i++) { scanf("%d %d %d %d %d",&rct[i].x1,&rct[i].y1,&rct[i].x2,&rct[i].y2,&rct[i].color); rc[rct[i].color]=1; x[j]=rct[i].x1; y[j]=rct[i].y1; j++; x[j]=rct[i].x2; y[j]=rct[i].y2; j++; } nn=n<<1; sort(x,x+nn); sort(y,y+nn); rcid=0; for(i=0;i<N;i++) if(rc[i]) rc[rcid++]=i; yid=0; for(i=1;i<nn;i++) if(y[i]!=y[i-1]) y[++yid]=y[i]; // build(0,yid,1); for(i=1;i<nn;i++) { if(x[i]==x[i-1]) continue; for(j=0;j<n;j++) if(rct[j].x1<=x[i-1]&&rct[j].x2>=x[i]) { flag=rct[j].color; update(rct[j].y1,rct[j].y2,0,yid,1); } differ=x[i]-x[i-1]; query(0,yid,1); color[1]=0; } if(T) printf("\n"); printf("Case %d:\n",++T); for(j=0,i=0;i<rcid;i++) if(area[rc[i]]) { j++; printf("%d %d\n",rc[i],area[rc[i]]); } if(j<=1) printf("There is %d color left on the wall.\n",j); else printf("There are %d colors left on the wall.\n",j); } return 0; }