K-th Number Poj - 2104 主席树

题意

给你n数字,然后有m次询问,询问一段区间内的第k小的数。

解题思路

这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简单,但是真的不会。限时结束后,学长说这个题是简单的主席树的入门题,我没学过啊。

如果你也没有学过的话,建议看我的另一篇博客,上面有自己的总结和一些博客推荐,就不用自己一个一个找了,点我进去。

哦, 这个题是主席树的模板题。

代码实现

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using  namespace std;
const int maxn=1e5+7;
int root[maxn], a[maxn], x, y, k;
int n, m, cnt, tot;
struct node{int l, r, sum; //左子树的编号,右子树的编号,区间内的标记的数的个数
}t[maxn*40];
vector<int> v;
int getid(int x) //需要进行离散化,因为主席树叶子端点上就是一个数。
{return lower_bound(v.begin(), v.end(), x) - v.begin() + 1; //这里用vector进行的离散化,比较简单
}
void update(int l, int r, int &x, int y, int pos) //注意参数中的l和r是区间范围,和node里面的l和r不一样,node里面的l和r表示左右子树的编号
//这里相当于建树+更新了,有的博客还单独写了一个build函数,然后再进行update,都行。
{t[++cnt]=t[y];t[cnt].sum++;x=cnt;//这里是把新节点的编号记录下来if(l==r) return ;int mid=(l+r)>>1;if(pos<=mid)//如果需要添加的编号小于mid,就向左子树走update(l, mid, t[x].l, t[y].l, pos);else //否则就是往右子树走update(mid+1, r, t[x].r, t[y].r, pos);
}
int query(int l, int r, int x, int y, int k) //这里的l和r也是区间范围,x是前一个线段树
{if(l==r)return l;int mid=(l+r)>>1;int sum=t[t[y].l].sum - t[t[x].l].sum; if(k<=sum)return query(l, mid, t[x].l, t[y].l, k);else return query(mid+1, r, t[x].r, t[y].r, k-sum);
}
int main()
{scanf("%d%d", &n, &m);for(int i=1; i<=n; i++){scanf("%d", &a[i]);v.push_back(a[i]);}sort(v.begin(), v.end()); //先排序,才能去重+离散化v.erase( unique( v.begin(), v.end() ) , v.end() );//去重tot=v.size(); //注意这里很重要,1到tot是我们主席树端点的个数。for(int i=1; i<=n; i++){update(1, tot, root[i], root[i-1], getid(a[i]) );}for(int i=1; i<=m; i++){scanf("%d%d%d", &x, &y, &k);printf("%d\n", v[ query(1, tot, root[x-1], root[y], k) - 1]);}return 0;} 

转载于:https://www.cnblogs.com/alking1001/p/11422955.html

K-th Number Poj - 2104 主席树相关推荐

  1. 【无码专区10】第K大查询(双向链表 /主席树+st表)

    已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...

  2. POJ 2104 划分树

    划分树:查询区间第K大 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #includ ...

  3. K-th Closest Distance HDU - 6621(第k小绝对值+主席树+二分)

    You have an array: a1, a2, , an and you must answer for some queries. For each query, you are given ...

  4. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  5. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)

    题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...

  6. 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings

    n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...

  7. 最详细的主席树(不修改,待修改) BZOJ 1901

    By Bartholomew 前置知识: 1.树状数组 2.线段树 主席树 模板是干什么的,其实就是询问区间第k大 不支持修改: 复杂度 O(nlogn) O ( n l o g n ) O(nlog ...

  8. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  9. poj 2104: K-th Number 【主席树】

    题目链接 学习了一下主席树,感觉具体算法思路不大好讲.. 大概是先建个空线段树,然后类似于递推,每一个都在前一个"历史版本"的基础上建立一个新的"历史版本",每 ...

  10. POJ - 2104 K-th Number(主席树)

    题目链接:点击查看 题目大意:给出一个数列,然后是m次查询,每次查询闭区间[l,r]内第K大的数 题目分析:裸的主席树,暑假集训第三周的时候就听说过了这个数据结构,不过当时太懒了,而且那些主席树的问题 ...

最新文章

  1. 用PS制作APP的界面图片
  2. R把天数据按照不同时间粒度聚合数据(Aggregate)
  3. 5训练需要更改参数吗_PM2.5和臭氧需要协同控制吗?
  4. Python后端相关技术/工具栈
  5. string的内存管理问题
  6. randn函数加噪声_损失函数 (Loss Function)
  7. (筆記) 如何避免iTunes自動備份? (iPhone) (iPad) (iOS) (iTunes)
  8. The library 'SocialSDK_QQZone_2.jar' contains nat
  9. 图片上传功能(EasyUI前台框架+SSM框架)
  10. 如何批量修改AD用户的Email属性
  11. 20个开源的工业设计软件
  12. 软件测试优秀员工发言稿,2018软件测试国赛获奖感言|2018年优秀员工获奖感言
  13. STRATASYS 即将收购 ORIGIN,将全新增材制造平台引入聚合物生产领域
  14. ESP8266教程5 — MCU和机智云APP之间互相通信
  15. 如何替换一个Linux内核函数的实现-热补丁原理
  16. nodejs+IIS+WebMatrix
  17. 电脑是台式的,开机的时候,滴滴滴滴一直响,开不了机!(好用)
  18. 如何在html中自动播放音乐,如何使音乐在打开页面时自动播放
  19. b站江科大自化协51单片机入门教程笔记(2)
  20. Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!

热门文章

  1. spring框架类加载顺顺序 并 在spring启动后查询数据库加载到容器内
  2. Spring Cloud Alibaba Sentinel之服务熔断篇
  3. BigDecimal源码分析及使用
  4. PanguVR获得400万种子轮融资,提供高效的VR家装解决方案
  5. [故障解决]Could not get a resource from the pool。
  6. 如何将txt中的数据整理到Matlab中画图
  7. 【转】android 常用theme
  8. 一步完成 MySQL 向 Redis 迁移
  9. 使用MyEclipse的自动提醒功能卡死MyEclipse的激活
  10. mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication解决办法