【模板】关于线段树减小占用内存

//某题代码
#include<iostream> #include<cstdio> #include<map> #include<cstring> using namespace std; long long a[100001],cnt=1; long long Max(long long AA,long long BB){ return AA>BB ? AA : BB; } struct node{ int ls,rs,v; }tree[10000001]; long long add(long long x,long long l,long long r,long long val){ tree[x].v++; if(l==r) return 0; long long mid=(l+r)/2; if(val<=mid){ if(tree[x].ls==0) tree[x].ls=++cnt; add(tree[x].ls,l,mid,val); } else{ if(tree[x].rs==0) tree[x].rs=++cnt; add(tree[x].rs,mid+1,r,val); } return 0; } long long dlt(long long x,long long l,long long r,long long val){ tree[x].v--; if(l==r) return 0; long long mid=(l+r)/2; if(val<=mid) dlt(tree[x].ls,l,mid,val); else dlt(tree[x].rs,mid+1,r,val); return 0; } long long srch(long long x,long long l,long long r,long long val){ if(l==r) return (long long)1; long long mid=(l+r)/2; if(mid>=val) return srch(tree[x].ls,l,mid,val); else return tree[tree[x].ls].v+srch(tree[x].rs,mid+1,r,val); } inline long long read(){ register long long s=(long long)0,w=(long long)1; register char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ s=(s<<1)+(s<<3)+(ch^48); ch=getchar(); } return s*w; } int main(){ //freopen("sort.in","r",stdin); //freopen("sort.out","w",stdout); long long n,Q; n=read(); Q=read(); for(register long long i=1;i<=n;++i){ a[i]=read(); //N=Max(N,a[i]); } //N++; for(register long long i=1;i<=n;++i) add(1,1,N,a[i]*n+i-1); while(Q--){ register long long op=0; op=read(); if(op==1){ register long long pos,shu; pos=read(); shu=read(); dlt(1,1,N,a[pos]*n+pos-1); add(1,1,N,shu*n+pos-1); a[pos]=shu; } else{ register long long shu; shu=read(); printf("%lld\n",srch(1,1,N,a[shu]*n+shu-1)); } } return 0; }

 map<long long,long long> tree

↑元素一多很容易爆内存

posted @ 2021-11-07 20:17  latent_Lin  阅读(37)  评论(0编辑  收藏  举报