当前位置: 首页 > news >正文

luogup3834(主席树模板)

luogup3834(主席树模板)

给定由N个正整数构成的序列,将对于指定的闭区间查询m次其区间内第k小值。1≤N,M≤2e5。

有一个做法,是对于每个序列的前缀建一颗权值线段树,然后通过权值线段树相减得到的权值线段树来查询第k小值。由于单点修改只需要改动logn个结点,第i个主席树可以依托第i-1个存在。具体的做法是将路径上的点从上到下依次克隆一遍。时间复杂度和空间复杂度都是nlogn。

#include <cctype>
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn=2e5+5, maxstree=maxn*60;
struct node{
    int l, r, x;
}stree[maxstree];

//a:离散化后的序列 b:离散化的数对应的值
int n, m, a[maxn], b[maxn], cntu;
//cntnode:主席树一共有几个结点
int cntnode=1, root[maxn];  //root:第i棵线段树的根的位置

//在主席树的当前区间[l, r)中插入值为v的结点
//now位置的结点会被拷贝一份生成新的结点
void insert(int &now, int l, int r, int v){
    stree[cntnode]=stree[now]; now=cntnode;  //(此处一举两得,既更新了父节点的孩子编号,又把操作转到了被复制的节点)
    ++stree[cntnode++].x;
    if (l==r-1) return;
    int mid=(l+r)>>1;
    if (v<mid) insert(stree[now].l, l, mid, v);
    else insert(stree[now].r, mid, r, v);
}

//在区间[l, r)中,定位第k大数
int query(int now1, int now2, int l, int r, int k){
    if (l==r-1) return l;
    int t=stree[stree[now2].l].x-stree[stree[now1].l].x, mid=(l+r)>>1;
    if (k<=t) return query(stree[now1].l, stree[now2].l, l, mid, k);
    else return query(stree[now1].r, stree[now2].r, mid, r, k-t);
}

inline void get(int &x){
    char c; int flag=1;
    for (; c=getchar(), !isdigit(c); )
        if (c=='-') flag=-1;
    for (x=c-48; c=getchar(), isdigit(c); )
        x=(x<<3)+(x<<1)+c-48; x*=flag;
}

int main(){
    get(n); get(m);
    for (int i=0; i<n; ++i){ get(a[i]); b[i]=a[i]; }
    sort(b, b+n); cntu=unique(b, b+n)-b;
    for (int i=0; i<n; ++i) a[i]=lower_bound(b, b+cntu, a[i])-b;
    for (int i=0; i<n; ++i){ root[i+1]=root[i]; insert(root[i+1], 0, n, a[i]); }
    int t1, t2, t3;
    while (m--){
        get(t1); get(t2); get(t3);
        printf("%d\n", b[query(root[t1-1], root[t2], 0, n, t3)]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/8575479.html

相关文章:

  • 如何写一份社区舆情信息报告的范文格式模板详解
  • expect - 自动交互脚本(转)
  • 网络舆情分析工作怎么做的平台解决办法
  • 政企如何做好互联网舆情信息监测分析的平台解决方案
  • 201521123055 软工阅读第二次作业
  • 某一舆情事舆情传播分析的三大方法技巧
  • Java中常见的锁分类以及对应特点
  • 如何做好银行金融舆情风险监测和方法工作的技术解决办法
  • Codeforces 707C. Pythagorean Triples-推公式的数学题
  • 网上与舆情通软件功能技术类似的系统整合
  • 319作业
  • 网上涉廉政网络舆情信息工作怎么做的平台服务方案
  • 字符串练习
  • 政企单位如何做好网络舆情监测与分析研判工作的方法措施
  • 政务舆情数据信息监测工作如何做的具体措施与解决方法
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • “大数据应用场景”之隔壁老王(连载四)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES10 特性的完整指南
  • node-glob通配符
  • PV统计优化设计
  • scala基础语法(二)
  • SQLServer之创建数据库快照
  • vue总结
  • 测试如何在敏捷团队中工作?
  • 分布式熔断降级平台aegis
  • 服务器从安装到部署全过程(二)
  • 复杂数据处理
  • - 概述 - 《设计模式(极简c++版)》
  • 基于组件的设计工作流与界面抽象
  • 数据科学 第 3 章 11 字符串处理
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 白色的风信子
  • const的用法,特别是用在函数前面与后面的区别
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)fgets与fputs函数详解
  • (poj1.3.2)1791(构造法模拟)
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (三)docker:Dockerfile构建容器运行jar包
  • (十三)Flask之特殊装饰器详解
  • (一)SpringBoot3---尚硅谷总结
  • *2 echo、printf、mkdir命令的应用
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net 托管代码与非托管代码
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题