为什么我的线段树要开8倍空间才能过。
丑陋的代码:
#include<bits/stdc++.h>
#define N 200005
#define int long long
#define ls(p) p<<1
#define rs(p) p<<1|1
using namespace std;
int read(){
int x=0,w=1;
char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*w;
}
int n,ans;
int x[N];
struct SegT{int sum,tag,len;}tree[N<<2];
struct seg{int l,r,h,d;}l[N];
bool cmp(seg x,seg y){return x.h<y.h;}
struct Segment{
void push_up(int p){
if(tree[p].tag) tree[p].sum=tree[p].len;
else tree[p].sum=tree[ls(p)].sum+tree[rs(p)].sum;
}
void build(int p,int l,int r){
tree[p].len=x[r+1]-x[l];
if(l==r) return ;
int mid=(l+r)>>1;
build(ls(p),l,mid); build(rs(p),mid+1,r);
push_up(p);
}
void update(int p,int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
tree[p].tag+=k;
push_up(p);
return ;
}
int mid=(l+r)>>1;
if(mid>=L) update(ls(p),l,mid,L,R,k);
if(mid<R) update(rs(p),mid+1,r,L,R,k);
push_up(p);
}
}segtree;
signed main(){
n=read();
for(int i=1;i<=n;++i){
int a=read(),b=read(),c=read(),d=read();
x[i*2-1]=a;x[i*2]=c;
l[i*2-1]=(seg){a,c,b,1};
l[i*2]=(seg){a,c,d,-1};
}
n<<=1;
sort(x+1,x+1+n);
sort(l+1,l+1+n,cmp);
int m=unique(x+1,x+1+n)-x-1;
segtree.build(1,1,m-1);
for(int i=1;i<=n;++i){
l[i].l=lower_bound(x+1,x+1+m,l[i].l)-x;
l[i].r=lower_bound(x+1,x+1+m,l[i].r)-x;
}
for(int i=1;i<n;++i){
segtree.update(1,1,m-1,l[i].l,l[i].r-1,l[i].d);
ans+=(l[i+1].h-l[i].h)*tree[1].sum;
}
printf("%lld",ans);
return 0;
}