社区讨论
萌新刚学扫描线,要调爆炸了,样例未过
P5490【模板】扫描线 & 矩形面积并参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo29zax8
- 此快照首次捕获于
- 2023/10/23 10:25 2 年前
- 此快照最后确认于
- 2023/11/03 10:37 2 年前
CPP
#include <bits/stdc++.h>
#define int long long
#define MAXN 1000005
using namespace std;
int n,cnt,ans,xl[MAXN*2];
struct line{
int x,xx,y,k;
}a[MAXN*2];
struct segment{
int l,r,len,flag;
}t[MAXN*4];
bool cmp(line A,line B){
return A.y<B.y;
}
void pushup(int x){
if(t[x].flag)t[x].len=t[x].r-t[x].l;
else t[x].len=t[x*2].len+t[x*2+1].len;
}
void change(int x,int l,int r,int k){
int L=t[x].l,R=t[x].r;
if(R<l||L>r)return ;
if(l<=L&&R<=r){
t[x].flag+=k;
pushup(x);
return ;
}
change(x*2,l,r,k);
change(x*2+1,l,r,k);
pushup(x);
}
void build(int x,int l,int r){
t[x].l=l,t[x].r=r;
t[x].len=0;
t[x].flag=0;
if(l==r)return ;
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
}
int query(int x){
return lower_bound(xl+1,xl+n+1,x)-xl;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
int x,y,xx,yy;
scanf("%lld%lld%lld%lld",&x,&y,&xx,&yy);
xl[i*2-1]=x,xl[i*2]=xx;
a[i*2-1]=(line){x,xx,y,1},a[i*2]=(line){x,xx,yy,-1};
}
n*=2;
sort(a+1,a+n+1,cmp);
sort(xl+1,xl+n+1);
int cnt1=unique(xl+1,xl+n+1)-xl-1;
build(1,1,cnt1);
for(int i=1;i<=n;i++){
change(1,query(a[i].x),query(a[i].xx)-1,a[i].k);
ans+=(a[i+1].y-a[i].y)*t[1].len;
//cout<<t[1].len<<endl;
}
printf("%lld",ans);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...