首页 > 其他分享 >主席树

主席树

时间:2023-10-30 21:44:24浏览次数:27  
标签:rs int sum mid ls 主席 op

//动态开点可持久化权值线段树
#include<bits/stdc++.h> using namespace std; const int N=2e5+5; struct Segmentree { int ls,rs,sum; }t[N<<5]; int rt[N],tot=0,n,m,a[N],b[N],p;//p含义为修改点 void build(int p,int l,int r) { p=++tot; if(l==r) return; int mid=(l+r)>>1; build(t[p].ls,l,mid); build(t[p].rs,mid+1,r); } int update(int root,int l,int r) { int op=++tot; t[op].ls=t[root].ls,t[op].rs=t[root].rs,t[op].sum=t[root].sum+1; if(l==r) return op;//左端点等于右端点,可以结束了 int mid=(l+r)>>1; if(p<=mid) t[op].ls=update(t[op].ls,l,mid); else t[op].rs=update(t[op].rs,mid+1,r); return op; } long long query(int u,int v,int l,int r,int k) { long long ans=0;int mid=(l+r)>>1; int x=t[t[v].ls].sum-t[t[u].ls].sum; if(l==r) return l; if(x>=k) ans=query(t[u].ls,t[v].ls,l,mid,k); else ans=query(t[u].rs,t[v].rs,mid+1,r,k-x);//此处递归到右子树需要减掉左子树已经拥有的排名 return ans; } int main() { //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); int len=unique(b+1,b+n+1)-b-1;//离散化,sort unique build(rt[0],1,len);//建空树 for(int i=1;i<=n;i++) { p=lower_bound(b+1,b+1+len,a[i])-b; rt[i]=update(rt[i-1],1,len);//一个一个加上去 } for(int i=1;i<=m;i++) { int l,r,k; scanf("%d%d%d",&l,&r,&k); long long ans=query(rt[l-1],rt[r],1,len,k); //cout<<ans<<endl; printf("%d\n",b[ans]); } return 0; }

主席树 - 孤独·粲泽 - 博客园 (cnblogs.com)他写的太好

标签:rs,int,sum,mid,ls,主席,op
From: https://www.cnblogs.com/mingloch/p/17798920.html

相关文章

  • BLOG1029<-主席树,
    这个比splay好学多了(主席树就是把每次修改的版本保留下来,版本就是线段树曾经的一个状态。如果打暴力的话可以想把每个状态的线段树都保留下来,炸飞了。主席树单点修改的话就是发现了每次修改只改了包含这个点的层,线段树上,这是\(\logn\)级的,我们可以只创建这些新节点。每次修......
  • 2023 年 CCPC 网络预选赛 L.Partially Free Meal (主席树)
    传送门先插个图玩云顶之弈。#include<iostream>#include<cstring>#include<algorithm>#include<vector>#definelllonglong#definefsfirst#definesesecondconstlongdoubleeps=1e-9;constintN=2e5+10,M=2e5+10;constintM......
  • 主席树(更新)
    主席树学习(无详细讲解过程,因为思想很简单)目录主席树学习背景:可持久化线段树(主席树)模板:静态区间第k大更多应用:(其实就是加了一点其他模板)和树dfs一起出:一些总结:更新内容(2023/10/25)区间修改(持久化tag)背景:sensi:今天咱们做一下优化dp,你们看看这个简单题。https://www.luogu.c......
  • 主席树初步
    什么是主席树主席树即可持久化线段树这边其实我目前感觉就是支持查询历史版本的线段树原理每当线段树修改时,维护其过去的版本,将其复制下来(然后就MLE了改进:对集合的每一个版本维护一个单独的根,在修改数据时,只复制树的一部分(复制一张别人的图Orz)建树类似......
  • 主席树
    权值线段树思路:现将数值离散化每个节点存的是值在\(l\)~\(r\)之间的数的个数,用线段树维护作用:求\(k\)小值或\(k\)大值查某一数值的排名查询数组排序查前驱、后继求逆序对相比平衡树:码量小、简单P1801黑匣子离散化:sort(alls.begin(),alls.end());alls.eras......
  • 【主席树】P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)题解
    P8201简单题。题中求的是\(dis_{a,t}\oplusdis_{t,b}=k\)是否存在,显然不好直接维护,考虑转化。令\(dist=dis_{a,t}\oplusdis_{t,b}\),\(val=\bigoplus\limits_{x\in\text{path}(a,b)}w_x\)。如果\(t\)在\(\text{path}(a,b)\)上,则\(dist=val\oplus......
  • 首位中国大陆学者!周志华当选新任国际人工智能联合会(IJCAI)理事会主席
    TOP前言“TOP大学来了”小编按,8月25日,在IJCAI2023闭幕式上,IJCAI执行委员会宣布欧洲科学院外籍院士、南京大学周志华教授当选为新一届的国际人工智能联合会理事会(IJCAITrustee)主席。“TOP大学来了”小编按,8月25日,在澳门举行的IJCAI2023闭幕式上,IJCAI执行委员会宣布欧洲科学院外......
  • 可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最小费用最大流预处理混合图上莫
    P8946TheLostSymbol这种类型的dp的特点就是大部分转移形如\(f(i,j)\rightarrowf(i+1,j+1)\)之类的,并且当以上转移出现时原数组被清空,这就可以用一个deque来维护,然后对于全局赋值/全局加,需要对每个位置维护一个时间戳,并记录上一次赋值/加是什么时候,以便标记下传。(貌似......
  • Cousleur (ICPC 青岛) (值域主席树 + 逆序对 + multiset +mp)
    题目大意:给一个序列 n会有n次操作,每次都会删除一个数这个数是连续子序列里面最大的逆序对的个数^Q[i],q[i]给出思路:启发式拆分,每次选择长度小的序列来进行处理数学化:rev(逆序对个数)   rev(x+1,r)=rev(l,r)-rev(l,x-1)-(一个元素......
  • 【主席树】CF813 E. Army Creation
    【主席树】CF813E.ArmyCreation题目链接:https://codeforces.com/contest/813/problem/E题意多次询问,求一个区间内,所有数个数的总和,但相同的数最多被计算k次,强制在线。题解这道题和牛客一道题很像,是那道题的加强版,链接在这:题解链接。那道题可以离线,所以离线处理+树状数组......