社区讨论
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 条回复,欢迎继续交流。
正在加载回复...