HDU 2665 Kth number(主席树静态区间第K大)题解
题意:问你区间第k大是谁
思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的。
具体可以看q学姐的B站视频
代码:
#include<cmath>
#include<set>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + ;
const int M = maxn * ;
const ull seed = ;
const int INF = 0x3f3f3f3f;
const int MOD = ;
int n, q, tot;
int a[maxn], root[maxn];
vector<int> st;
int getId(int x){
return lower_bound(st.begin(), st.end(),x) - st.begin() + ;
}
struct node{
int lson, rson;
int sum;
}T[maxn * ];
void update(int l, int r, int &now, int pre, int v, int pos){
T[++tot] = T[pre], T[tot].sum += v, now = tot;
if(l == r) return;
int m = (l + r) >> ;
if(m >= pos)
update(l, m, T[now].lson, T[pre].lson, v, pos);
else
update(m + , r, T[now].rson, T[pre].rson, v, pos);
}
int query(int l, int r, int pre, int now, int k){
if(l == r) return l;
int m = (l + r) >> ;
int sum = T[T[now].lson].sum - T[T[pre].lson].sum;
if(sum >= k)
return query(l, m, T[pre].lson, T[now].lson, k);
else
return query(m + , r, T[pre].rson, T[now].rson, k - sum);
}
int main(){
int t;
scanf("%d", &t);
while(t--){
tot = ;
scanf("%d%d", &n, &q);
st.clear();
for(int i = ; i <= n; i++)
scanf("%d", &a[i]), st.push_back(a[i]);
sort(st.begin(), st.end());
st.erase(unique(st.begin(), st.end()), st.end()); for(int i = ; i <= n; i++)
update(, n, root[i], root[i - ], , getId(a[i]));
while(q--){
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
printf("%d\n", st[query(, n, root[l - ], root[r], k) - ]);
}
}
return ;
}
HDU 2665 Kth number(主席树静态区间第K大)题解的更多相关文章
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
- POJ2104-- K-th Number(主席树静态区间第k大)
[转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...
- [hdu2665]Kth number(划分树求区间第k大)
解题关键:划分树模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cs ...
- hdu 2665 Kth number 主席树
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- HDU3727--Jewel (主席树 静态区间第k大)
Jewel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- [poj 2104]主席树+静态区间第k大
题目链接:http://poj.org/problem?id=2104 主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即 ...
- K-th Number 线段树的区间第K大
http://poj.org/problem?id=2104 由于这题的时间限制不紧,所以用线段树水一水. 每个节点保存的是一个数组. 就是对应区间排好序的数组. 建树的时间复杂度需要nlogn 然后 ...
- poj 2104 主席树(区间第k大)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44940 Accepted: 14946 Ca ...
随机推荐
- MongoDB - 2
Aggregation Framework: $project: a document stream by renaming, adding, or removing fields #alter Da ...
- SQL两表之间:根据一个表的字段更新另一个表的字段
update table1 set field1=table2.field1,field2=table2.field2from table2where table1.id=table2.id
- docker镜像导入导出
1.使用 save命令将 镜像保存为文件docker save -o 自定义文件名.tar 已存在的镜像名 2.使用load命令将镜像文件保存到本地仓库docker load -i 自定义文件名. ...
- 深入剖析虚拟DOM提升性能(Vue,React);
I.原始渲染方式(直接操作DOM): 1.state数据: 2.JSX模板: 3.数据 + 模板 相结合,生成真实的DOM来显示: 4.state发生改变: 5.数据 + 模板结合,生成真实的DOM来 ...
- Linux/Windows 应用程序开发
一.基础知识 虽然写的都是代码,但是代码运行在哪个级别什么位置,还是需要做好定位,这样才心中有数. 1.1 Linux [转载]讲述了中断.系统调用.Linux APIs和Shell的基本知识. 1 ...
- C语言之指针若干问题
1.指针变量的赋值问题. 常常有偷懒的小伙子,这样赋值 int *Pointer = 3:/ 这是给Pointer 所指的变量赋值,刚创建Pointer时,它所指的变量是不固定的,可能是某个重要的系 ...
- 使用微软自带 SharpZipLib 进行多文件 压缩
/// <summary> /// 指定路径打包下载 /// </summary> /// <param name="fileName">< ...
- phpstorm----------phpstorm设置自动更新的ssh信息如何修改--后续增加如何设置自动更新
1.如何设置phpstorm将本地代码时时同步到远程服务器 注意下面一定要打勾 点击下一步,然后还有一个页面,然后不用做任何操作,直接点击完成.中途有个页面是输入远程服务器ip账号密码链接方式的,那个 ...
- linux配制DNS服务器基本能功能
1.环境 Centos 6.5 bind 关闭防火墙和SELINUX 2.安装bind服务软件 yum -y install bind 3.配制主配制文件/etc/name.conf options ...
- Windbg程序调试系列3-线程阻塞问题
上一篇博文给大家分享了使用Windbg分析内存泄露问题: Windbg程序调试系列2-内存泄露问题 本篇我们继续跟大家分享,如何分析解决线程阻塞问题. 从根本上讲,线程阻塞属于程序Hang的一种,其表 ...