POJ 2104 静态找区间第k大
静态区间第k大的问题,往往可以利用主席树来解决
这是主席树的第一道题
主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存
每一个节点保存的线段树都记录当前整段前缀区间的信息
但是因为每次添加后一个节点,那么他除了当前节点位置需要更新之外,其他的位置都可以保持跟上一棵节点对应的线段树一致,那么为了缩小内存,
将那些不需要改变的点的指针指向上一棵树对应的节点即可,其他多生成的节点也就是需要更新的节点,最多不超过log2n个,所以最后产生的线段树的
点的个数大概在nlogn的大致范围内
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- #define N 100005
- #define M int m=(l+r)>>1
- #define LS(o) node[o].ls
- #define RS(o) node[o].rs
- int n , m , a[N] , b[N] , T[N];
- struct Node{
- int sz , ls , rs;
- void init(){sz=;ls=rs=;}
- }node[N*];
- int tot;
- int build(int l , int r)
- {
- int u = tot++;
- node[u].init();
- if(l!=r){
- M;
- node[u].ls = build(l , m);
- node[u].rs = build(m+ , r);
- }
- return u;
- }
- void build(int o1 , int o2 , int l , int r , int pos)
- {
- node[o2].init();
- node[o2].sz = node[o1].sz+;
- M;
- if(l == r) return;
- if(pos<=m){
- node[o2].ls = tot++ , node[o2].rs = RS(o1);
- build(LS(o1) , LS(o2) , l , m , pos);
- }
- else {
- node[o2].rs = tot++ , node[o2].ls = LS(o1);
- build(RS(o1) , RS(o2) , m+ , r , pos);
- }
- }
- int query(int o1 , int o2 , int l , int r , int k)
- {
- if(l==r) return l;
- M;
- int tmp;
- if((tmp=node[LS(o2)].sz - node[LS(o1)].sz)>=k) return query(LS(o1) , LS(o2) , l , m , k);
- else return query(RS(o1) , RS(o2) , m+ , r , k-tmp);
- }
- int main()
- {
- // freopen("in.txt" , "r" , stdin);
- while(~scanf("%d%d" , &n , &m)){
- for(int i= ; i<=n ; i++)scanf("%d" , a+i);
- for(int i= ; i<=n ; i++)b[i]=a[i];
- sort(b+ , b+n+);
- tot = ;
- T[] = build( , n);
- for(int i= ; i<=n ; i++){
- int pos = lower_bound(b+ , b+n+ , a[i])-b;
- T[i] = tot++;
- build(T[i-] , T[i] , , n , pos);
- }
- while(m--){
- int s , t , k;
- scanf("%d%d%d" , &s , &t , &k);
- int pos = query(T[s-] , T[t] , , n , k);
- printf("%d\n" , b[pos]);
- }
- }
- return ;
- }
POJ 2104 静态找区间第k大的更多相关文章
- POJ 2104 求序列里第K大 主席树裸题
给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么 只有询问,没有修改 可以用归并树和划分树(我都没学过..囧) 我是专门冲着弄主席树来的 对主席树的建树方式有点了解了,不过这题为 ...
- POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)
题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...
- POJ 2104(K-th Number-区间第k大-主席树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 31790 Accepted: 9838 Cas ...
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...
- 【POJ】【2104】区间第K大
可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...
- 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大)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44940 Accepted: 14946 Ca ...
- POJ 2104 HDU 2665 主席树 解决区间第K大
两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R ...
- 数据结构2 静态区间第K大/第K小
给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...
随机推荐
- golang代码执行顺序
一:首先man.go,整个程序的入口 func main() { beego.Run() } 然后beego.run()代码 // Run beego application. // beego.Ru ...
- nexus 2.6需要jdk7才能跑起来
Java 6 Support EOLOracle's support for Java 6 ended in February 2013. Consequentially as of version ...
- git命令之git rebase 的用法
rebase 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 现在我 ...
- C++常量(C++数值常量、字符串常量、符号常量)
http://see.xidian.edu.cn/cpp/biancheng/view/104.html 字符串常量 用双撇号括起来的部分就是字符串常量,如"abc"," ...
- JavaScript的事件对象_鼠标事件
鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备.那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等. 一.鼠标按钮 只有在主鼠标按钮被单击时(常规一般是鼠标左键)才会触发 ...
- 接收ET采集器数据页面
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="u ...
- phalcon: Windows 下 Phalcon dev-tools 配置 和 Phpstorm中配置Phalcon 代码提示, phalcon tools的使用
准备: phalcon-devtools包 下载地址: https://github.com/phalcon/phalcon-devtools 解压到wampserver的www目录 (xampp 用 ...
- 抛弃vboot不格盘用grub4dos+firadisk安装Ghost版XP到VHD,轻松RAMOS!
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=363198&extra=抛弃vboot不格盘用grub4dos+firadisk安 ...
- jQuery clone()方法绑定事件
先看如下代码: (function ($) { var div = $("<div></div>").css({width: "100px&quo ...
- JavaWeb基础: 学习大纲
JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...