社区讨论
线段树空间疑问
P5490【模板】扫描线 & 矩形面积并参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjtfdhy
- 此快照首次捕获于
- 2025/11/04 08:13 4 个月前
- 此快照最后确认于
- 2025/11/04 08:13 4 个月前
为什么我的代码线段树空间使用 的 倍无法通过,需使用 倍。
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 条回复,欢迎继续交流。
正在加载回复...