社区讨论

AC了但求助

P5490【模板】扫描线 & 矩形面积并参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mhj0haex
此快照首次捕获于
2025/11/03 18:42
4 个月前
此快照最后确认于
2025/11/03 18:42
4 个月前
查看原帖
rt,本人是将横纵坐标都离散化后线段树修改的,一开始线段树开4倍空间18pts RE,开8倍空间18pts WA,12倍空间AC,求问原因。
18pts RE代码:
CPP
#include<bits/stdc++.h>
#define int long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<48){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}

inline void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x<10) putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
}

const int N=1e5+5;
int n,X[2*N],Y[2*N];
struct sw{
	int l,r,w;
};
vector<sw> g[2*N]; 

struct WS{
	int _x1,_x2,_y1,_y2;
}mat[N];

struct seg{
	int l,r,len,tag;
}tr[4*N];

inline void upd(int id){
	if(tr[id].tag){
		tr[id].len=(X[tr[id].r+1]-X[tr[id].l]);
	}
	else{
		tr[id].len=tr[ls].len+tr[rs].len;
	}
}

inline void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r,tr[id].len=tr[id].tag=0;
	if(l==r){
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}

inline void update(int id,int l,int r,int k){
	//printf("id=%lld [%lld,%lld]\n",id,tr[id].l,tr[id].r);
	if(l<=tr[id].l&&tr[id].r<=(r-1)){
		//printf("%lld is fully covered\n",id);
		tr[id].tag+=k;
		upd(id);
		return ;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	if(l<=mid) update(ls,l,r,k);
	if((r-1)>mid) update(rs,l,r,k);
	upd(id);
}

signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		mat[i]._x1=read(),mat[i]._y1=read(),mat[i]._x2=read(),mat[i]._y2=read();
		X[2*i-1]=mat[i]._x1,X[2*i]=mat[i]._x2;
		Y[2*i-1]=mat[i]._y1,Y[2*i]=mat[i]._y2;
	}
	sort(X+1,X+2*n+1);sort(Y+1,Y+2*n+1);
	int lenx=unique(X+1,X+2*n+1)-X-1;
	int leny=unique(Y+1,Y+2*n+1)-Y-1;
	for(int i=1;i<=n;i++){
		int x_1=lower_bound(X+1,X+lenx+1,mat[i]._x1)-X;
		int y_1=lower_bound(Y+1,Y+leny+1,mat[i]._y1)-Y;
		int x_2=lower_bound(X+1,X+lenx+1,mat[i]._x2)-X;
		int y_2=lower_bound(Y+1,Y+leny+1,mat[i]._y2)-Y;
		g[y_1].push_back((sw){x_1,x_2,1});
		g[y_2].push_back((sw){x_1,x_2,-1});
	}
	build(1,1,lenx-1);
	int ans=0;
	
	/*
	for(int i=1;i<=2*n;i++){
		printf("X[%lld]=%lld\n",i,X[i]);
	}
	for(int i=1;i<=2*n;i++){
		printf("Y[%lld]=%lld\n",i,Y[i]);
	}
	*/
	
	for(int i=1;i<2*n;i++){
		for(int j=0;j<g[i].size();j++){
			int l=g[i][j].l,r=g[i][j].r,w=g[i][j].w;
			//printf("[%lld,%lld]+=%lld\n",l,r,w);
			update(1,l,r,w);
		}
		int changx=tr[1].len;
		ans=ans+(Y[i+1]-Y[i])*changx;
		//printf("ans+=(%lld-%lld)*%lld\n",Y[i+1],Y[i],changx);
	}
	printf("%lld",ans);
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...