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

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

时间:2022-11-08 00:22:06浏览次数:47  
标签:rt return int 线段 tr mid P3834 tl 模板

先用结构体实现了下,发现写错了(只有20分),后面直接用的数组了

 

 

#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 7;

int tl[N << 6], tr[N << 6], sum[N << 6];
int cnt, a[N], v[N], rt[N];

int build(int l, int r){
  int p = ++ cnt;
  sum[p] = 0;
  if(l == r)
    return p;
  int mid = (l + r) >> 1;
  tl[p] = build(l, mid);
  tr[p] = build(mid + 1, r);
  return p;
}

int insert(int l, int r, int val, int pre){
  int p = ++ cnt;
  tl[p] = tl[pre], tr[p] = tr[pre];
  sum[p] = sum[pre] + 1;
  if(l == r) return p;
  int mid = (l + r) >> 1;
  if(val <= mid) tl[p] = insert(l, mid, val, tl[pre]);
  else tr[p] = insert(mid + 1, r, val, tr[pre]);
  return p;
}

int query(int prel, int prer, int k, int l, int r){
  if(l == r)
    return v[l];
  int suml = sum[tl[prer]] - sum[tl[prel]];
  int mid = (l + r) >> 1;
  if(k <= suml) return query(tl[prel], tl[prer], k, l, mid);
  else return query(tr[prel], tr[prer], k - suml, mid + 1, r);
}

int main(){
  int n, q;
  scanf("%d%d", &n, &q);
  for(int i = 1;i <= n;i ++){
    scanf("%d", &a[i]);
    v[i] = a[i];
  }
  sort(v + 1, v + n + 1);
  int t = unique(v + 1, v + n + 1) - v - 1;
  rt[0] = build(1, t);

  for(int i = 1;i <= n;i ++){
    int val = lower_bound(v + 1, v + t + 1, a[i]) - v;
    rt[i] = insert(1, n, val, rt[i - 1]);
  }
  while(q --){
    int l, r, k;
    scanf("%d%d%d", &l, &r, &k);
    printf("%d\n", query(rt[l - 1], rt[r], k, 1, n));
  }
  return 0;
}

标签:rt,return,int,线段,tr,mid,P3834,tl,模板
From: https://www.cnblogs.com/loser--QAQ/p/16867972.html

相关文章

  • 线段树(Segment Tree)是一个基于分治的数据结构。
    线段树(SegmentTree)是一个基于分治的数据结构。线段树杂谈 概念:线段树(SegmentTree)是一个基于分治的数据结构。通常处理区间,序列中的查询,更改问题。大体上有单修,单......
  • P5367 【模板】康托展开
    题意求\(1\simN\)的一个给定全排列在所有\(1\simN\)全排列中的排名。结果对\(998244353\)取模。分析模板,又学习了一种新的东西,但好像除了做这道体外,还不知道有......
  • JAVA 模板设计模式
    今天来介绍下一个我觉得蛮不错的设计模式(比较容易应用于业务场景),它就是---模板设计模式。OK,我们直接看代码:模板模式,那当然我们需要建一个模板先,建一个抽象类,VehicleControlM......
  • LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
    \[C_k=\sum_{i|j=k}A_iB_j\]这样的或卷积可以做一次\(\text{FWT}\),把数组变为\(a_i=\sum_{j\subseteqi}A_i\),也就是子集和的形式,然后就可以对应位相乘了变回去的......
  • CF1045G AI Robots (动态开点线段树 + 离散化)(关于其空间复杂度的分析)
    题目大意:火星上有\(N\)个机器人排成一行,第\(i\)个机器人的位置为\(x_i\),视野维\(r_i\),智商为\(q_i\)。我们认为第\(i\)个机器人可以看到的位置是\([x_i-r_i,......
  • 【模板】最长回文串长度 manacher
    \(pa_i\)表示以\(i\)为中心的(原串的)回文串长度#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;intn,m,pa[......
  • Elasticsearch拼音搜索:自定义分词器的模板
    PUT/test{"settings":{"analysis":{"analyzer":{"my_analyzer":{"tokenizer":"ik_max_word","filter":"py"}......
  • 通用模板对象池-转载
    一个很好用的对象池,分享一下,原文链接:https://www.cnblogs.com/hnxxcxg/p/3191622.html//标准模板unituObjPools;interfaceusesClasses,SysUtils,UntThreadTimer,......
  • 可持久化线段树
    数组一般开maxn<<5,但有的时候也会不够,不知道怎么判断得到的建议是“贴着内存开”。最套路的应用就是各种形式的区间k小:K小数保存一下模板code#include<bits/stdc+......
  • 【模板】广义后缀自动机 exSAM
    postedon2022-11-0218:51:48|under模板|sourcesolution膜拜@xzzduang。我们重学一个SAM。一个点维护的是所有\(endpos=S\)的(本质不同的)串,显然这些串的长度......