外网AC,洛谷60
查看原帖
外网AC,洛谷60
565450
__K2FeO4楼主2022/10/1 15:06
#include<bits/stdc++.h>
using namespace std;
const int N=1022;
typedef long long ll;
int n,m=0;
struct area{
	int lx,ly,rx,ry;//siz=(rx-lx)*(ry-ly);
	int clr=1;
	int e,s,w,n;//direction
	int siz(){
		return (rx-lx)*(ry-ly);
	}
}a[N*N];
int llx[N],lly[N],urx[N],ury[N],cl[N];
int xx[2*N],yy[2*N],ans[N];
//chlorine?
//Cl2
//sodium chloride!
//NaCl

signed main(){
	int cx=2,cy=2,t=0;
	scanf("%d %d %d",urx,ury,&n);
	xx[1]=urx[0],yy[1]=ury[0],cl[0]=1;
	for(int i=1;i<=n;i++){
		scanf("%d%d%d%d%d",llx+i,
		lly+i,urx+i,ury+i,cl+i);
		if(llx[i]>=urx[i]||lly[i]>=ury[i])continue;
		xx[cx++]=llx[i];
		xx[cx++]=urx[i];
		yy[cy++]=lly[i];
		yy[cy++]=ury[i];
	}
	sort(xx,xx+cx);
	sort(yy,yy+cy);
	for(int i=1;i<cx;i++)
	if(xx[i]!=xx[t])xx[++t]=xx[i];
	cx=t+1;
	t=0;
	for(int i=1;i<cy;i++)
	if(yy[i]!=yy[t])yy[++t]=yy[i];
	cy=t+1;
	/*
	for(int i=0;i<cx;i++)
	printf("%d ",xx[i]);
	for(int i=0;i<cy;i++)
	printf("%d ",yy[i]);*/
	//cut the tofu???
	for(int j=1;j<cy;j++)
	for(int i=1;i<cx;i++){
		a[++m].lx=xx[i-1];
		a[m].rx=xx[i];
		a[m].ly=yy[j-1];
		a[m].ry=yy[j];
		if(i!=1)a[m-1].e=m;
		if(j!=1)a[m-cx+1].n=m;
	}
	for(int i=1;i<cx;i++){
		a[++m].lx=xx[i-1];
		a[m].rx=xx[i];
		if(i!=1)a[m-1].e=m;
		a[m].n=i;
	}
	//printf("OK");
	for(int i=n;i>0;i--){
		//printf("%d\n",i);
		if(llx[i]>=urx[i]||lly[i]>=ury[i])continue;
		int now=(cx-1)*(cy-1)+1;
		while(now&&a[now].lx<llx[i])now=a[now].e;
		if(!now)continue;
		for(int j=now;j&&a[j].rx<=urx[i];j=a[j].e){
			int cur=j;
			while(a[cur].n&&a[a[cur].n].ly<lly[i])cur=a[cur].n;
			if(!cur)continue;
			int k;
			for(k=a[cur].n;k&&a[k].ry<=ury[i];k=a[k].n){
				ans[cl[i]]+=a[k].siz();
				//printf("clear(%d,%d,%d,%d)\n",a[k].lx,a[k].ly,a[k].rx,a[k].ry);
			}
				
			a[cur].n=k;
		}
		//printf("OK");
	}
	int suma=urx[0]*ury[0];
	for(int i=1;i<=n+1;i++)
	suma-=ans[i];
	ans[1]+=suma;
	for(int i=1;i<=n+1;i++)
	if(ans[i])printf("%d %d\n",i,ans[i]);
	return 0;
}
2022/10/1 15:06
加载中...