luogu3834 【模板】可持久化线段树 1(主席树)
2024-09-02 14:57:41
关于空间,第零棵树是 \(4n\),其后每棵树都要多来 \(\log(n)\) 的空间,所以我是开 \(n(4+\log(n))\) 的空间。
关于借用节点:
图片来自这里
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, rot[200005], a[200005], b[200005], sum[4400005], lson[4400005];
int rson[4400005], uu, vv, ww, r, cnt;
int build(int l, int r){
int rt=++cnt;
int mid=(l+r)>>1;
sum[rt] = 0;
if(l<r){
lson[rt] = build(l, mid);
rson[rt] = build(mid+1, r);
}
return rt;
}
int update(int pre, int l, int r, int x){//pre就是rt准备“借”的那棵树
int rt=++cnt;
int mid=(l+r)>>1;
lson[rt] = lson[pre]; rson[rt] = rson[pre]; sum[rt] = sum[pre] + 1;
if(l<r){
if(x<=mid) lson[rt] = update(lson[pre], l, mid, x);
else rson[rt] = update(rson[pre], mid+1, r, x);
}
return rt;
}
int query(int uu, int vv, int l, int r, int k){
if(l>=r) return l;
int x=sum[lson[vv]]-sum[lson[uu]];
int mid=(l+r)>>1;
if(x>=k) return query(lson[uu], lson[vv], l, mid, k);
else return query(rson[uu], rson[vv], mid+1, r, k-x);
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b+1, b+1+n);
r = unique(b+1, b+1+n) - (b + 1);
rot[0] = build(1, r);
for(int i=1; i<=n; i++){
int t=lower_bound(b+1, b+1+r, a[i])-b;//快速找出a[i]在整个不可重数组中的位置
rot[i] = update(rot[i-1], 1, r, t);
}
while(m--){
scanf("%d %d %d", &uu, &vv, &ww);
printf("%d\n", b[query(rot[uu-1], rot[vv], 1, r, ww)]);
}
return 0;
}
最新文章
- memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法
- WinRAR命令行
- nginx同一iP多域名配置方法
- C语言实现冒泡排序-整数排序
- Javascript中的Label语句
- C# List中写出LINQ类似SQL的语句
- GUI编程笔记(java)09:GUI控制文本框只能输入数字字符案例
- Ubuntu16.04下Intellij IDEA不能输入中文的问题
- SSH Session Recorder
- IT第二天 - JAVA环境的配置、Hello的编写
- MYSQL-用户权限的验证过程(转)
- 第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)
- [js高手之路] es6系列教程 - 对象功能扩展详解
- copy11
- KMP算法 Next数组详解
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
- Protostuff序列化分析
- IdentityServer4实战 - 谈谈 JWT 的安全策略
- Shell命令-文件及目录操作之touch、tree
- Linux中执行C++程序
热门文章
- 开机启动+Linux发送邮件
- ReferenceError: password is not defined
- 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写
- OC 思维导向图
- hdu 3555 Bomb 炸弹(数位DP,入门)
- codevs 1497 取余运算
- Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
- [Android 测试] 压力稳定性测试之: Monkey 详解分析脚本(转载)
- CPP-基础:C++中为什么需要一个头文件,一个cpp文件
- JavaScript中数据类型和typeof返回的数据类型