题意:给定一个数组,每次查询第l到r区间的第k大值

解法嘛,当然是主席树,主席树即可持久化线段树,什么叫可持久化呢,就是指能够访问历史版本的数据结构,那么对于某些只能离线处理的题目强制在线之后 ,可以通过在线处理操作

经过这题总算对可持久化线段树有了些了解,我们开始先建一颗空树,然后对于每次修改我们只会修改logn个点,我们可以新建logn个来避免每次都新建一颗线段树导致的爆空间,

对于这题来说我们线段树中维护的是这个区间的点的个数,插入的时候按权值大小插入,对于l到r我们可以通过1-r减去1-(l-1)来求出l到r的,对于第k大我们可以用求平衡树第k大的做法,每次查询节点个数看往左走还是往右走

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define C 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pii pair<int,int> using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; int a[N],b[N],tot,rt[N*],ls[N*],rs[N*],sum[N*];
void build(int &o,int l,int r)
{
o=++tot;
sum[o]=;
if(l==r)return;
int m=(l+r)>>;
build(ls[o],l,m);
build(rs[o],m+,r);
}
void update(int &o,int l,int r,int last,int p)
{
o=++tot;
ls[o]=ls[last];
rs[o]=rs[last];
sum[o]=sum[last]+;
if(l==r)return ;
int m=(l+r)>>;
if(p<=m)update(ls[o],l,m,ls[last],p);
else update(rs[o],m+,r,rs[last],p);
}
int query(int ss,int tt,int l,int r,int x)
{
if(l==r)return l;
int m=(l+r)>>;
int cnt=sum[ls[tt]]-sum[ls[ss]];
if(x<=cnt)query(ls[ss],ls[tt],l,m,x);
else query(rs[ss],rs[tt],m+,r,x-cnt);
}
void work(int sz)
{
int ql,qr,x;
scanf("%d%d%d",&ql,&qr,&x);
int ans=query(rt[ql-],rt[qr],,sz,x);
printf("%d\n",b[ans]);
}
void debug()
{
puts("***********");
for(int i=;i<=tot;i++)
printf("%d %d %d\n",ls[i],rs[i],sum[i]);
puts("***********");
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int t;
scanf("%d",&t);
while(t--)
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+n+);
int sz=unique(b+,b++n)-(b+);
tot=;
build(rt[],,sz);
// debug();
for(int i=;i<=n;i++)a[i]=lower_bound(b+,b++sz,a[i])-b;
for(int i=;i<=n;i++)update(rt[i],,sz,rt[i-],a[i]);
// debug();
while(q--)work(sz);
}
return ;
}
/********************
1
4 2
4 1 3 2
2 3 2
********************/

最新文章

  1. maven操作
  2. 去掉Win7资源管理器左侧导航窗格中的收藏夹、库等的方法
  3. Swift-4-数组和字典
  4. 【二分+最大团】【HDU3585】【maximum shortest distance】
  5. XPath与多线程爬虫
  6. paip.php 配置ZEND DEBUGGER 断点调试for cli..
  7. Vsftp配置都没有问题 连接不上 530 Login incorrect 解决方法
  8. 记一次使用Node.js electron打包网站的记录
  9. python的类变量与实例变量以及__dict__属性
  10. 【软件工程】5.8 黑盒&amp;白盒测试
  11. ok6410下的uboot分析与实现
  12. 虚拟主机修改上传配置(PHP)
  13. Future和FutureTask
  14. Filter学习(三)Filter(过滤器)常见应用
  15. Firebird3 embedded connection
  16. UVA 11105 Semi-prime H-numbers
  17. 分布式实时日志分析解决方案ELK部署架构
  18. 抛弃Https让Cas以Http协议提供单点登录服务
  19. 如何学习MySQL
  20. 浅谈windows.onload()与$(document).ready()

热门文章

  1. CRM客户关系管理系统-需求概设和详设
  2. 0x03 MySQl 库操作
  3. java.sql.SQLException: The user specified as a definer (&#39;root&#39;@&#39;%&#39;) does not exist
  4. javaweb action无法跳转、表单无法跳转的解决方法
  5. WebService中WSDL和WADL(转)
  6. 解决问题知识点--mysql数据库
  7. 3.6.使用STC89C52控制MC20解析GPS的经纬度数据上传到指定服务器
  8. 内置函数(Day16)
  9. django-admin 修改admin自带模版
  10. 曾经跳过的坑----js截取字符串substr与substring 和 trim