社区讨论

TLE 28pts 求条

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mljosc1x
此快照首次捕获于
2026/02/13 00:42
7 天前
此快照最后确认于
2026/02/13 14:24
6 天前
查看原帖
重新回来写扫描线,然后用动态开点代替离散化后写了这个出来,结果炸了(#3~10 TLE)
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
	int xl,xr,y;
	int v;
	bool operator <(const node tmp)const{
		return y<tmp.y;
	}
}p[201010];
struct sgt{
	int v[6401010];
	int tag[6401010];
	int ls[6401010];
	int rs[6401010];
	int cnt=1;
	__inline void add_node(int &x){
		x=++cnt;
	}
	void push_up(int now,int l,int r){
		v[now]=v[ls[now]]+v[rs[now]];
	}
	#define mid ((l+r)>>1)
	void push_down(int now,int l,int r){
		if(!tag[now])return;
		add_tag(ls[now],l,mid,tag[now]);add_tag(rs[now],mid+1,r,tag[now]);
		tag[now]=0;
	}
	void add_tag(int &now,int l,int r,int p){
		if(!now)add_node(now);
		tag[now]+=p;
		if(tag[now]<0)push_down(now,l,r); 
		if(tag[now]>0)v[now]=(r-l+1);
		else push_up(now,l,r);
	}
	int root=1;//read-only
	void add(int &now,int l,int r,int ql,int qr,int x){
		if(!now)add_node(now);
		if(ql<=l&&r<=qr){
			add_tag(now,l,r,x);
			return;
		}
		push_down(now,l,r);
		if(ql<=mid)add(ls[now],l,mid,ql,qr,x);
		if(mid<qr)add(rs[now],mid+1,r,ql,qr,x);
		push_up(now,l,r);
	}
	int query(){
		return v[root];
	}
}tree;
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		int xl,yl,xr,yr;cin>>xl>>yl>>xr>>yr;
		p[i*2-1]=(node){xl,xr-1,yl,1};
		p[i*2]=(node){xl,xr-1,yr,-1};
	}
	sort(p+1,p+1+n*2);
	long long ans=0;
	constexpr int inf=1e9;
	for(int i=1;i<=2*n;i++){
		ans+=1ll*(p[i].y-p[i-1].y)*tree.query();
		tree.add(tree.root,1,inf,p[i].xl,p[i].xr,p[i].v);
	}
	cout<<ans<<'\n';
	#ifndef ONLINE_JUDGE
	system("pause");
	#endif
	return 0;
}

回复

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

正在加载回复...