K-th Number Poj - 2104 主席树
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 主席树相关推荐
- 【无码专区10】第K大查询(双向链表 /主席树+st表)
已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...
- POJ 2104 划分树
划分树:查询区间第K大 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #includ ...
- 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 ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...
- 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings
n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...
- 最详细的主席树(不修改,待修改) BZOJ 1901
By Bartholomew 前置知识: 1.树状数组 2.线段树 主席树 模板是干什么的,其实就是询问区间第k大 不支持修改: 复杂度 O(nlogn) O ( n l o g n ) O(nlog ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- poj 2104: K-th Number 【主席树】
题目链接 学习了一下主席树,感觉具体算法思路不大好讲.. 大概是先建个空线段树,然后类似于递推,每一个都在前一个"历史版本"的基础上建立一个新的"历史版本",每 ...
- POJ - 2104 K-th Number(主席树)
题目链接:点击查看 题目大意:给出一个数列,然后是m次查询,每次查询闭区间[l,r]内第K大的数 题目分析:裸的主席树,暑假集训第三周的时候就听说过了这个数据结构,不过当时太懒了,而且那些主席树的问题 ...
最新文章
- 用PS制作APP的界面图片
- R把天数据按照不同时间粒度聚合数据(Aggregate)
- 5训练需要更改参数吗_PM2.5和臭氧需要协同控制吗?
- Python后端相关技术/工具栈
- string的内存管理问题
- randn函数加噪声_损失函数 (Loss Function)
- (筆記) 如何避免iTunes自動備份? (iPhone) (iPad) (iOS) (iTunes)
- The library 'SocialSDK_QQZone_2.jar' contains nat
- 图片上传功能(EasyUI前台框架+SSM框架)
- 如何批量修改AD用户的Email属性
- 20个开源的工业设计软件
- 软件测试优秀员工发言稿,2018软件测试国赛获奖感言|2018年优秀员工获奖感言
- STRATASYS 即将收购 ORIGIN,将全新增材制造平台引入聚合物生产领域
- ESP8266教程5 — MCU和机智云APP之间互相通信
- 如何替换一个Linux内核函数的实现-热补丁原理
- nodejs+IIS+WebMatrix
- 电脑是台式的,开机的时候,滴滴滴滴一直响,开不了机!(好用)
- 如何在html中自动播放音乐,如何使音乐在打开页面时自动播放
- b站江科大自化协51单片机入门教程笔记(2)
- Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
热门文章
- spring框架类加载顺顺序 并 在spring启动后查询数据库加载到容器内
- Spring Cloud Alibaba Sentinel之服务熔断篇
- BigDecimal源码分析及使用
- PanguVR获得400万种子轮融资,提供高效的VR家装解决方案
- [故障解决]Could not get a resource from the pool。
- 如何将txt中的数据整理到Matlab中画图
- 【转】android 常用theme
- 一步完成 MySQL 向 Redis 迁移
- 使用MyEclipse的自动提醒功能卡死MyEclipse的激活
- mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication解决办法