首页 > 其他分享 >P3834 【模板】可持久化线段树 2

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

时间:2022-10-06 15:12:48浏览次数:74  
标签:ch int 线段 tr P3834 模板 define

P3834

主席树模板,求区间第k小。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define lc tr[i].ch[0]
 4 #define rc tr[i].ch[1]
 5 #define Lc tr[j].ch[0]
 6 #define Rc tr[j].ch[1]
 7 #define mid ((l + r) >> 1)
 8 const int N = 2e5 + 10;
 9 int n, m, a[N], b[N];
10 int cnt, rt[N];
11 struct node {
12     int num, ch[2];
13 }tr[N * 20];
14 void update(int &i, int j, int l, int r, int k) {
15     i = ++cnt;//编号 
16     tr[i] = tr[j];//复制之前版本
17     ++ tr[i].num;
18     if (l == r) return ;
19     if (k <= mid) update(lc, Lc, l, mid, k);
20     else update(rc, Rc, mid + 1, r, k);
21 }
22 int query(int i, int j, int l, int r, int k) {
23     if (l == r) return l;//返回下标
24     int s = tr[Lc].num - tr[lc].num;
25     if (k <= s) return query(lc, Lc, l, mid, k);
26     else return query(rc, Rc, mid + 1, r, k - s); 
27 } 
28 int main() {
29     scanf("%d %d", &n, &m);
30     for (int i = 1; i <= n; i ++) {
31         scanf("%d", &a[i]);
32         b[i] = a[i];
33     }
34     sort(b + 1, b + n + 1);
35     int tot = unique(b + 1, b + n + 1) - b - 1;
36     cnt = 0, rt[0] = 0;
37     for (int i = 1; i <= n; i ++)
38     update(rt[i], rt[i - 1], 1, tot, lower_bound(b + 1, b + tot + 1, a[i]) - b);
39     int x, y, k;
40     while (m --) {
41         scanf("%d %d %d", &x, &y, &k);
42         printf("%d\n", b[query(rt[x - 1], rt[y], 1, tot, k)]);
43     }
44     return 0;
45 }

 

标签:ch,int,线段,tr,P3834,模板,define
From: https://www.cnblogs.com/YHxo/p/16757649.html

相关文章

  • 动态开点线段树
    引入在普通的线段树中,我们一般要开\(4N\)的数组以避免越界。然而,在一些题目中,空间限制并不允许我们这样做。考虑如下问题:有一个长度为\(n\)的数组,初始全部为\(0\)......
  • TZOJ 6948: 走迷宫/深搜模板
    描述 有一个迷宫,图案如图5.2.6所示,红色区域表示不能通行,蓝色区域表示能通行,在迷宫中通行的方向是上下左右四个方向。从入口(1,1)位置进入迷宫,编程判断能否从出口位置......
  • C++ 泛型(模板与容器)
    文章目录​​一、泛型的基本思想:​​​​函数模板的性质​​​​C++模版函数/类的语法​​​​类模板的性质​​​​二、C++STL简介​​​​2.1算法(algorithm)​​​​2.......
  • 高级vue 模板中 ref 的使用用法
    ref+普通dom标签 获取真实dom对象ref+组件标签 获取组件实例对象 <template>  <h1ref="h1Ref">www.96net.com.cn</h1>  <ref-comoonentref="co......
  • 字符串哈希 模板 例题
    字符串哈希可以快速判断两个子字符串是否相等原理:https://www.cnblogs.com/ydUESTC/p/15722400.html注意字符串哈希时后面的字符视为低位,这样方便取一段字符的哈希时先......
  • 异或方程组高斯消元模板
    inlinevoidsolve(intn){for(inti=1,top=1;i<=n;i++,top++){intcur=0;for(intj=top;j<=n;j++)if(m......
  • 读boost::multi_array有感,多维数组实现(非类型模板,偏特化)
    开发环境:VS2002(VC7)本文做如下简化:1,假定所有维元素都是5。2,不考虑const的[]。3,由于只是熟悉原理,不考虑各种异常情况。问题一,请实现一个一维整形数组,只需重载[]。问......
  • Prism 模板使用
    一、打开VisualStudio2022工具,选择“扩展”中的“扩展管理”菜单。如下图:二、在“扩展管理”界面中,搜索“PrismTemplatePack”并下载安装。如下图:三、重新打开Visu......
  • 事件相机特征跟踪-模板跟踪方法
    ​1、前言由于事件相机不能提供完整的图像,所以最初的特征跟踪依赖传统相机的数据。本推送介绍事件相机特征检测与跟踪的一篇较早的工作:FeatureDetectionandTrackingwith......
  • 李超线段树 学习笔记
    Idea主要用于动态维护一个线段或直线集合,支持在平面直角坐标系中插入一条线段或者直线,以及查询某一横坐标上的最值。考虑在x轴上建立一棵线段树,每一个节点\([l,r]\)......