POJ 2104 K-th Number(划分树)
参考HH大神的模版。对其中一些转移,还没想清楚,大体明白上是怎么回事了,划分树就是类似快排,但有点点区别的。多做几个题,慢慢理解。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define N 100100
struct node
{
int l,r;
}tree[*N];
int sorted[N];
int lnum[][N];
int val[][N]; void build(int d,int l,int r,int rt)
{
int m,lsame,i,lpos,rpos,same;
tree[rt].l = l;
tree[rt].r = r;
if(l == r) return ;
m = (l+r)>>;
lsame = (m - l + );
for(i = l;i <= r;i ++)
{
if(val[d][i] < sorted[m])
lsame --;
}
lpos = l;
rpos = m+;
same = ;
for(i = l;i <= r;i ++)
{
if(i == l)//lnum[d][i]表示[tree[rt].l, i ]区域里有多少个数分到左边
lnum[d][i] = ;
else
lnum[d][i] = lnum[d][i-];
if(val[d][i] < sorted[m])
{
lnum[d][i] ++;
val[d+][lpos++] = val[d][i];
}
else if(val[d][i] > sorted[m])
{
val[d+][rpos++] = val[d][i];
}
else
{
if(same < lsame)
{
same ++;
lnum[d][i] ++;
val[d+][lpos++] = val[d][i];
}
else
{
val[d+][rpos++] = val[d][i];
}
}
}
build(d+,lson);
build(d+,rson);
}
int query(int d,int k,int l,int r,int rt)
{
int s,ss,nl,nr,m,rs,rss;//s表示[ l , r ]有多少个分到左边
if(l == r)//ss表示 [tree[idx].left , l-1 ]有多少个分到左边
{
return val[d][l];
}
if(l == tree[rt].l)
{
s = lnum[d][r];
ss = ;
}
else
{
s = lnum[d][r] - lnum[d][l-];
ss = lnum[d][l-];
}
if(s >= k)
{
nl = ss + tree[rt].l;
nr = ss + tree[rt].l + s - ;
return query(d+,k,nl,nr,rt<<);
}
else
{
m = (tree[rt].l + tree[rt].r)>>;
rss = l - tree[rt].l - ss;
rs = r - l + - s;
nl = m + rss + ;
nr = m + rs + rss;
return query(d+,k-s,nl,nr,rt<<|);
}
}
int main()
{
int i,n,m,x,y,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = ;i <= n;i ++)
{
scanf("%d",&val[][i]);
sorted[i] = val[][i];
}
sort(sorted+,sorted+n+);
build(,,n,);
for(i = ;i < m;i ++)
{
scanf("%d%d%d",&x,&y,&k);
printf("%d\n",query(,k,x,y,));
}
}
return ;
}
POJ 2104 K-th Number(划分树)的更多相关文章
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- poj 2104 K-th Number 划分树,主席树讲解
K-th Number Input The first line of the input file contains n --- the size of the array, and m --- t ...
- 静态区间第k大(划分树)
POJ 2104为例[经典划分树问题] 思想: 利用快速排序思想, 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半. 查询时,在建树过程中利 ...
- [NBUT 1458 Teemo]区间第k大问题,划分树
裸的区间第k大问题,划分树搞起. #pragma comment(linker, "/STACK:10240000") #include <map> #include ...
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...
- hdu 2665 Kth number (poj 2104 K-th Number) 划分树
划分树的基本功能是,对一个给定的数组,求区间[l,r]内的第k大(小)数. 划分树的基本思想是分治,每次查询复杂度为O(log(n)),n是数组规模. 具体原理见http://baike.baidu. ...
- [hdu2665]Kth number(划分树求区间第k大)
解题关键:划分树模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cs ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- HDU 2665 Kth number(划分树)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
随机推荐
- Step
php+MySQL html+css JQuery Mobile JavaScript weiPHP Sina Cloud 微信公众订阅号平台开发
- 如何下载google play免费应用的apk文件
到这里: http://apps.evozi.com/apk-downloader/ 一看便知.
- 【转】Oracle数据库中Sequence的用法
在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...
- 74 使用BitSet输出数组中的重复元素
[本文链接] http://www.cnblogs.com/hellogiser/p/using-bitset-to-print-duplicate-elements-of-array.html [题 ...
- (转)SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)
五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...
- block引发的陷阱
block在项目的开发中使用时非常频繁的,苹果官方也极力推荐使用block.其实,究其本质,block就是指向结构体的指针(可利用运行时机制查看底层生成的c代码).然而在使用block时会存在很多陷阱 ...
- Spell checker(poj 1035)
题意: 此题是一个字符串的问题,首先要给出一个字典,里面存储了数个单词.而后,给出一个单词,如果字典中存在,那么就输出correct,如果字典中没有,那么就要判断是不是这个单词有错误,错误有3 ...
- Linux C 知识 char型数字转换为int型 int型 转换为Char
前言 在九度oj做acm的时候,经常会遇到了char类型和int类型相互转化的问题,这里进行一下总结.今后,可能会多次更新博客,因为半年做了很多总结,但是都是保存在word文档上了,现在开始慢慢向CS ...
- centos下安装五笔输入法的教程
[root@ok ~]# yum update [root@ok ~]# yum install ibus-table-chinese-wubi-haifeng 以上两步已经成功!! #yum ins ...
- .net自定义事件,经典简单实例代码
1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...