社区讨论

线段树空间疑问

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjtfdhy
此快照首次捕获于
2025/11/04 08:13
4 个月前
此快照最后确认于
2025/11/04 08:13
4 个月前
查看原帖
为什么我的代码线段树空间使用 NN88 倍无法通过,需使用 1616 倍。
AC 代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (id<<1)
#define rs (id<<1|1)
const int N=1e5;

int n;
int xa,ya,xb,yb;
ll ans;
struct Line{
	int xl,xr;
	int y;
	int val;
	bool operator <(Line b){
		return y<b.y;
	}
}line[(N<<1)+5];
int x[(N<<1)+5],k;

struct ST{
	int l,r;
	int len;
	int cover;
}st[N*2*4*2+5];

void push_up(int id){
	if(st[id].cover)
		st[id].len=x[st[id].r+1]-x[st[id].l];
	else
		st[id].len=st[ls].len+st[rs].len;
	return ;
}

void build(int id,int l,int r){
	st[id].l=l;
	st[id].r=r;
	if(l==r)
		return ;
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(id);
	return ;
}

void update(int id,int l,int r,int val){
	// cout<<"update "<<id<<":point range["<<st[id].l<<","<<st[id].r<<"]||query"<<" in range ["<<l<<","<<r<<"] to plus "<<val<<"\n";
	if(st[id].l>r||st[id].r<l){
		// cout<<"  just return\n";
		return ;
	}
	if(st[id].l>=l&&st[id].r<=r){
		st[id].cover+=val;
		push_up(id);
		// cout<<"  return after update\n";
		return ;
	}
	update(ls,l,r,val);
	update(rs,l,r,val);
	push_up(id);
	return ;
}

int main(){
	// freopen("P5490_3.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>xa>>ya>>xb>>yb;
		line[i]={xa,xb,ya,1};
		line[i+n]={xa,xb,yb,-1};
		x[i]=xa;
		x[i+n]=xb;
	}
	n<<=1;
	sort(line+1,line+n+1);
	sort(x+1,x+n+1);
	k=unique(x+1,x+n+1)-x-1;
	// cout<<"build [1,"<<k-1<<"]\n";
	build(1,1,k-1);
	// cout<<"build is ok\n";
	for(int i=1;i<n;i++){
		int l=lower_bound(x+1,x+k+1,line[i].xl)-x;
		int r=lower_bound(x+1,x+k+1,line[i].xr)-x;
		update(1,l,r-1,line[i].val);
		ans+=(ll)st[1].len*(line[i+1].y-line[i].y);
	}
	cout<<ans<<"\n";
	return 0;
}

回复

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

正在加载回复...