离散化+差分,70,三个WA求调呜呜呜
查看原帖
离散化+差分,70,三个WA求调呜呜呜
1081824
LoveFrieren楼主2024/6/3 13:32

本人思路: 先对x轴和y轴离散化,然后差分后前缀和求出原图(疯狂容斥一波)最后对每一个x所在列计算面积为h,一旦下一列和本列不一样,ans+=size(宽度)* sy(每一列的高度),然后size清零以此类推 不是tle,是wa

#include<bits/stdc++.h>
#define M 4096
#define lb lower_bound
using namespace std;
struct place{
	int x1,y1,x2,y2;
}p[M];
struct xlr {int l,r;} len[M];
int x[M],y[M];
long long n,ans=0;
int chf[M][M],sum[M][M];
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;++i){
		int x1,x2,y1,y2;
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
		p[i].x1=min(x1,x2), p[i].y1=min(y1,y2);
		p[i].x2=max(x1,x2), p[i].y2=max(y1,y2);
		x[i]=p[i].x1, x[n+i]=p[i].x2;
		y[i]=p[i].y1, y[n+i]=p[i].y2;
		len[i].l=p[i].x1, len[i].r=p[i].x2;
	}
	sort(x+1,x+2*n+1);sort(y+1,y+2*n+1);
	auto kx=unique(x+1,x+2*n+1);
	auto ky=unique(y+1,y+2*n+1);
	for(int i=1;i<=n;++i){
		int x1n,y1n,x2n,y2n;
		x1n=lb(x+1,kx,p[i].x1)-x;
		x2n=lb(x+1,kx,p[i].x2)-x;
		y1n=lb(y+1,ky,p[i].y1)-y;
		y2n=lb(y+1,ky,p[i].y2)-y;
		chf[y1n][x1n]++;chf[y2n][x2n]++;
		chf[y1n][x2n]--;chf[y2n][x1n]--;
	}
	for(int i=1;i<ky-y;++i)
		for(int j=1;j<kx-x;++j)
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+chf[i][j];
	int sy=0,syl,size=0;
	for(int i=1;i<kx-x;++i){
		syl=sy;
		sy=0;
		int yl,yr;
		for(int j=1;j<ky-y;++j){
			if(sum[j][i] && !sum[j-1][i]) yl=j;
			if(sum[j][i] && !sum[j+1][i]){
				yr=j+1;
				sy+=y[yr]-y[yl];
			}
		}
		if(sy==syl){
			size+=x[i]-x[i-1];
		}
		else{
			size+=x[i]-x[i-1];
			ans+=size*syl;
			size=0;
		}
	}
	cout<<ans;
	return 0;
}
2024/6/3 13:32
加载中...