社区讨论

AC 了但有一个关于区间的疑问

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@locg8fss
此快照首次捕获于
2023/10/30 13:18
2 年前
此快照最后确认于
2023/11/02 10:42
2 年前
查看原帖
代码如下:
C
#include<bits/stdc++.h>
#define int long long
#define ls(x) 2*x
#define rs(x) 2*x+1 
using namespace std;
int n,linecnt,flag[200005<<4],length[200005<<4],cx[200005<<4],ans;
#define posinx(x) (lower_bound(cx+1,cx+1+cnt,x)-cx)
struct scanline{
	int y,lx,rx,inout;
	bool operator<(scanline b) const{
		return y<b.y;
	}
}li[200005];
void pushup(int p,int l,int r){
	if(flag[p])length[p]=cx[r+1]-cx[l];
	else length[p]=length[ls(p)]+length[rs(p)];
}
void update(int l,int r,int x,int s,int t,int p){
	if(l<=s&&t<=r){
		flag[p]+=x;
		pushup(p,s,t);
		return ;
	}
	int m=s+t>>1;
	if(l<=m)update(l,r,x,s,m,ls(p));
	if(r>m)update(l,r,x,m+1,t,rs(p));
	pushup(p,s,t); 
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		li[++linecnt]={y1,x1,x2,1};
		cx[linecnt]=x1;
		li[++linecnt]={y2,x1,x2,-1};
		cx[linecnt]=x2;
	}
	sort(cx+1,cx+1+linecnt);
	sort(li+1,li+1+linecnt);
	int cnt=unique(cx+1,cx+1+linecnt)-cx-1;
	cx[cnt+1]=cx[cnt];
	update(posinx(li[1].lx),posinx(li[1].rx)-1,li[1].inout,1,cnt,1);
	for(int i=2;i<=linecnt;i++){
		ans+=length[1]*(li[i].y-li[i-1].y);
		update(posinx(li[i].lx),posinx(li[i].rx)-1,li[i].inout,1,cnt,1);
	}
	cout<<ans;
	return 0;
}
如果第 46 行 update(posinx(li[i].lx),posinx(li[i].rx)-1,li[i].inout,1,cnt,1); 其中的右端点不-1,且第 15 行 if(flag[p])length[p]=cx[r+1]-cx[l];右端点不+1 , 为什么就没法求出正确答案呢?
(实质上就是闭区间和左闭右开区间)

回复

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

正在加载回复...