社区讨论
AC了但求助
P5490【模板】扫描线 & 矩形面积并参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0haex
- 此快照首次捕获于
- 2025/11/03 18:42 4 个月前
- 此快照最后确认于
- 2025/11/03 18:42 4 个月前
rt,本人是将横纵坐标都离散化后线段树修改的,一开始线段树开4倍空间18pts RE,开8倍空间18pts WA,12倍空间AC,求问原因。
18pts RE代码:
CPP#include<bits/stdc++.h>
#define int long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<48){
if(c=='-') f=-1;
c=getchar();
}
while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x<10) putchar(x+'0');
else write(x/10),putchar(x%10+'0');
}
const int N=1e5+5;
int n,X[2*N],Y[2*N];
struct sw{
int l,r,w;
};
vector<sw> g[2*N];
struct WS{
int _x1,_x2,_y1,_y2;
}mat[N];
struct seg{
int l,r,len,tag;
}tr[4*N];
inline void upd(int id){
if(tr[id].tag){
tr[id].len=(X[tr[id].r+1]-X[tr[id].l]);
}
else{
tr[id].len=tr[ls].len+tr[rs].len;
}
}
inline void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r,tr[id].len=tr[id].tag=0;
if(l==r){
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
inline void update(int id,int l,int r,int k){
//printf("id=%lld [%lld,%lld]\n",id,tr[id].l,tr[id].r);
if(l<=tr[id].l&&tr[id].r<=(r-1)){
//printf("%lld is fully covered\n",id);
tr[id].tag+=k;
upd(id);
return ;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(l<=mid) update(ls,l,r,k);
if((r-1)>mid) update(rs,l,r,k);
upd(id);
}
signed main(){
n=read();
for(int i=1;i<=n;i++){
mat[i]._x1=read(),mat[i]._y1=read(),mat[i]._x2=read(),mat[i]._y2=read();
X[2*i-1]=mat[i]._x1,X[2*i]=mat[i]._x2;
Y[2*i-1]=mat[i]._y1,Y[2*i]=mat[i]._y2;
}
sort(X+1,X+2*n+1);sort(Y+1,Y+2*n+1);
int lenx=unique(X+1,X+2*n+1)-X-1;
int leny=unique(Y+1,Y+2*n+1)-Y-1;
for(int i=1;i<=n;i++){
int x_1=lower_bound(X+1,X+lenx+1,mat[i]._x1)-X;
int y_1=lower_bound(Y+1,Y+leny+1,mat[i]._y1)-Y;
int x_2=lower_bound(X+1,X+lenx+1,mat[i]._x2)-X;
int y_2=lower_bound(Y+1,Y+leny+1,mat[i]._y2)-Y;
g[y_1].push_back((sw){x_1,x_2,1});
g[y_2].push_back((sw){x_1,x_2,-1});
}
build(1,1,lenx-1);
int ans=0;
/*
for(int i=1;i<=2*n;i++){
printf("X[%lld]=%lld\n",i,X[i]);
}
for(int i=1;i<=2*n;i++){
printf("Y[%lld]=%lld\n",i,Y[i]);
}
*/
for(int i=1;i<2*n;i++){
for(int j=0;j<g[i].size();j++){
int l=g[i][j].l,r=g[i][j].r,w=g[i][j].w;
//printf("[%lld,%lld]+=%lld\n",l,r,w);
update(1,l,r,w);
}
int changx=tr[1].len;
ans=ans+(Y[i+1]-Y[i])*changx;
//printf("ans+=(%lld-%lld)*%lld\n",Y[i+1],Y[i],changx);
}
printf("%lld",ans);
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...