20分......向dalao求助

P3834 【模板】可持久化线段树 2

希望更丰富的展现?使用Markdown
by yyk504 @ 2019-05-11 15:41:30


~~坚信不是我的错~~ ```cpp #include<bits/stdc++.h> #define N 320000 struct info{int lson,rson,sum;}tree[N*33]; int n,m,a[N],b[N],root[N],x,y,k,cnt,root_now,num; std::map<int,int> mp; inline int add(int be_poi,int poi,int val,int xx,int yy) { int mid=(xx+yy)>>1,t; tree[t=++num]=tree[be_poi]; tree[t].sum+=val; if (xx==yy) return num; if (poi<=mid) tree[t].lson=add(tree[be_poi].lson,poi,val,xx ,mid); if (poi >mid) tree[t].rson=add(tree[be_poi].rson,poi,val,mid+1,yy ); return t; } inline int query(int root_1,int root_2,int xx,int yy,int kth) { int mid=(xx+yy)>>1,t; if (xx==yy) return mid; if ((t=tree[tree[root_2].lson].sum-tree[tree[root_1].lson].sum)>=kth) return query(tree[root_1].lson,tree[root_2].lson,xx ,mid,kth ); else return query(tree[root_1].rson,tree[root_2].rson,mid+1,yy ,kth-t); } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; std::sort(b+1,b+1+n); for (int i=1;i<=n;i++) mp[b[i]]=++cnt; n=cnt; tree[0]=info{0,0,0}; for (int i=1;i<=n;i++) root[i]=add(root_now,mp[a[i]],1,1,n),root_now=root[i]; for (int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&k),printf("%d\n",b[query(root[x-1],root[y],1,n,k)]); } ```
by 湛卢 @ 2019-05-11 15:42:40


您是挂了哪几个点?
by KokiNiwa @ 2019-11-07 22:40:31


|