求助,关于数组大小
查看原帖
求助,关于数组大小
212349
ChengJY_楼主2022/2/19 10:38

为什么我的线段树要开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;
}


2022/2/19 10:38
加载中...