题目:https://www.luogu.org/problemnew/show/P3834

无法忍受了,我要写主席树!

解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权值线段树;

然后 n 棵线段树可以共用一些节点;

线段树的 sum 可以相减,利用这个查询即可;

什么嘛,主席树也没我想得那么难(蛮简单的)!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=2e5+;
int n,m,q,t[maxn],ls[maxn<<],rs[maxn<<],sum[maxn<<],cnt,a[maxn],b[maxn];
//注意数组范围,每次新增log(m)个点
int build(int l,int r)
{
int rt=++cnt,mid=((l+r)>>);
sum[rt]=;
if(l<r){build(l,mid); build(mid+,r);}
return rt;
}
int update(int pre,int l,int r,int x)
{
int rt=++cnt,mid=((l+r)>>);
ls[rt]=ls[pre]; rs[rt]=rs[pre]; sum[rt]=sum[pre]+;
if(l<r)
{
if(x<=mid)ls[rt]=update(ls[pre],l,mid,x);
else rs[rt]=update(rs[pre],mid+,r,x);
}
return rt;
}
int query(int u,int v,int l,int r,int k)
{
if(l>=r)return l;
int mid=((l+r)>>);
int x=sum[ls[v]]-sum[ls[u]];
if(x>=k)return query(ls[u],ls[v],l,mid,k);
else return query(rs[u],rs[v],mid+,r,k-x);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b+n+);
m=unique(b+,b+n+)-b-;
t[]=build(,m);
for(int i=;i<=n;i++)
{
int tmp=lower_bound(b+,b+m+,a[i])-b;
t[i]=update(t[i-],,m,tmp);
}
for(int i=,l,r,x;i<=q;i++)
{
scanf("%d%d%d",&l,&r,&x);
int tmp=query(t[l-],t[r],,m,x);
printf("%d\n",b[tmp]);
}
return ;
}

洛谷P3834 可持久化线段树(主席树)模板的更多相关文章

  1. 洛谷 [P3834] 可持久化线段树(主席树)

    主席树可以存储线段树的历史状态,空间消耗很大,一般开45n即可 #include <iostream> #include <cstdio> #include <cstri ...

  2. 洛谷 P3919 可持久化线段树 题解

    题面 这题好水的说~很明显就是主席树的大板子 然而我交了3遍才调完所有的BUG,开好足够的数组,卡掉大大的常数: 针对与每次操作,change()会创建新节点,而ask()虽然也会更新左右儿子的节点编 ...

  3. 【洛谷2839/BZOJ2653】middle(主席树)

    题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...

  4. LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)

    LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...

  5. 洛谷P2633 Count on a tree(主席树上树)

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...

  6. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  7. 洛谷$P$4137 $Rmq\ Problem / mex$ 主席树

    正解:主席树 解题报告: 传送门$QwQ$ 本来以为是道入门无脑板子题,,,然后康了眼数据范围发现并没有我想像的那么简单昂$kk$ 这时候看到$n$的范围不大,显然考虑离散化?但是又感觉似乎布星?因为 ...

  8. 洛谷$P$3168 任务查询系统 $[CQOI2015]$ 主席树

    正解:主席树 解题报告: 传送门! 首先考虑如果是单点修改,那就是个线段树板子嘛$QwQ$ 然后现在是区间修改,对于区间修改,显然就考虑差分下,就变成单点修改辣$QwQ$ 同时单点查询前$k$小也就变 ...

  9. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

随机推荐

  1. [Windows Server 2012] MySQL安全加固

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:MySQL ...

  2. php判断form数据是否为POST而来,判断数据提交方式

    //判断form数据是否为POST而来,判断数据提交方式 if ($_SERVER['REQUEST_METHOD'] != 'POST') { // 非 POST 来路,做警告或你想做的事 retu ...

  3. 查看Windows XP是否已激活的方法

    打开开始→运行, 在输入:oobe/msoobe /a,回车后系统会弹出窗口告诉你系统是否已经激活

  4. Python 之数据类型

    # Numbers(数字) # int(有符号整型) # long(长整型[也可以代表八进制和十六进制]) # float(浮点型) # complex(复数) # String(字符串) # Lis ...

  5. Python3:numpy模块中的argsort()函数

    Python3:numpy模块中的argsort()函数   argsort函数是Numpy模块中的函数: >>> import numpy >>> help(nu ...

  6. EF 配置

    DbContext public class ZSZDbContext : DbContext { //ILog ILogger 容易混淆 private static ILog log = LogM ...

  7. JS练习:表格全选与全不选

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  8. odoo api介绍

    odoo api修饰器介绍与应用 参考文档:https://www.cnblogs.com/kfx2007/p/6093994.html 一.one one的用法主要用于self为单一集合的情况,被o ...

  9. 00110_Class类

    1.Class 对象是在加载类时由 Java虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的: 2.获取Class对象的三种方式 (1)方式一:通过Object类中的getObj ...

  10. Linux学习总结(3)——Linux实用工具

    1. Windows下同步Linux文件(Linux安装Samba和配置) 场景需求: 安装了Ubuntu在虚拟机上,但是代码编辑或者其它更多的操作的时候,还是习惯在windows下进行.如果wind ...