POJ 2104 K-th Number(主席树模板题)
http://poj.org/problem?id=2104
题意:
求区间$[l,r]$的第k小。
思路:
主席树不好理解啊,简单叙述一下吧。
主席树就是由多棵线段树组成的,对于数组$a[1,2...n]$,对于每个i,我们都去建立一棵线段树维护$a[1,..i]$出现的数的个数。
但是如果每一棵线段树都去新建结点的话,那这内存的开销是十分巨大的。。。
我们可以发现,第i棵线段树和第i-1棵线段树有很多结点都是相同的,这样一来,我们就没必要再去重新新建结点了,直接套用上一棵线段树的结点即可。
这里我想引用一张某大神博客的手绘图解:(来自http://blog.csdn.net/regina8023/article/details/41910615)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=+; int n, m;
int tot_num;
int tot=;
int b[maxn],c[maxn],t[maxn]; struct node
{
int l,r,num;
}a[maxn*]; int build(int l ,int r)
{
int root=++tot;
a[root].num=;
if(l==r) return root;
int mid=(l+r)>>;
a[root].l=build(l,mid);
a[root].r=build(mid+,r);
return root;
} int update(int root, int x)
{
int now=++tot;
int tmp=now;
a[tot].num=a[root].num+;
int l=,r=tot_num;
while(l<r)
{
int mid=(l+r)>>;
if(x<=mid)
{
a[now].l=++tot;
a[now].r=a[root].r; //这儿不需修改,套用上一棵线段树的数即可
root=a[root].l;
now=tot;
r=mid;
}
else
{
a[now].l=a[root].l; //同理
a[now].r=++tot;
root=a[root].r;
now=tot;
l=mid+;
}
a[now].num=a[root].num+;
}
return tmp;
} int query(int ql, int qr, int k)
{
int l=,r=tot_num;
while (l<r)
{
int mid=(l+r)>>;
if (a[a[qr].l].num-a[a[ql].l].num>=k) //>=k,说明肯定在该区间内,继续往下缩小范围
{
r=mid;
ql=a[ql].l;
qr=a[qr].l;
}
else
{
l=mid+;
k-=a[a[qr].l].num-a[a[ql].l].num; //<k,说明左区间的数不够,先减去左区间的数,然后往右区间搜索
ql=a[ql].r;
qr=a[qr].r;
}
}
return l;
} int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&c[i]);
b[i]=c[i];
}
sort(b+,b+n+);
tot_num=unique(b+,b+n+)-b-;
t[]=build(,tot_num); //初始化
for(int i=;i<=n;i++)
{
t[i]=update(t[i-],lower_bound(b+,b+tot_num+,c[i])-b);
}
while(m--)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",b[query(t[l-],t[r],k)]);
}
return ;
}
POJ 2104 K-th Number(主席树模板题)的更多相关文章
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- 主席树:POJ2104 K-th Number (主席树模板题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44952 Accepted: 14951 Ca ...
- SPOJ MKTHNUM & POJ 2104 - K-th Number - [主席树模板题]
题目链接:http://poj.org/problem?id=2104 Description You are working for Macrohard company in data struct ...
- 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题
达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...
- poj2104 主席树模板题
题意 给出n个数字组成的数字序列,有m组询问.每次询问包含三个数字l,r,k.对于每个询问输出序列区间[l,r]中第k大的数字. 分析 这是主席树的模板题,套板子就可以 #include <cs ...
- hdu2665(主席树模板题)
hdu2665 题意 求区间第 k 小. 分析 参考 这类题目做法挺多的,例如 划分树. 这里使用主席树再写一发,不得不说主席树相比而言要好写的多,比起普通线段树,主席树就是复用了线段树共有的信息. ...
- POJ-2104-K-th Number(区间第K大+主席树模板题)
Description You are working for Macrohard company in data structures department. After failing your ...
- POJ 2104 主席树模板题
#include <iostream> #include <cstdio> #include <algorithm> int const maxn = 200010 ...
- POJ2104 K-th Number 划分树 模板题啊
/*Source Code Problem: 2104 User: 96655 Memory: 14808K Time: 1282MS Language: G++ Result: Accepted S ...
随机推荐
- zookeeper java调用及权限控制
import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayLis ...
- 高性能mysql 第1,2,3章。
一: 第一章 1:使用事务 start transaction; select * from t1; commit; 2:查看事务状态 mysql> show variables like 'a ...
- [LeetCode] 694. Number of Distinct Islands
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- 将Mongo装为Windows的服务
PHP的mongo扩展: 首先 下载一个PHP的mongo扩展, 地址:http://download.csdn.net/detail/qq_36387589/9819259 然后修改php.ini. ...
- sql查询一列 重复的数据
select * from 表 where num in(select num from 表 group by num having count(num)>1)
- svn回滚到某一版本
svn回滚到某一版本 (1)在代码文件夹或vs中show log,查看历史,记住想要回滚到的版本号如1000 (2)新建文件夹,右击svn checkout,在revision中输入版本号1000
- System.arraycopy方法详解
- 网络编程—代码—TCP网络传输
一.TCP:用字符流传输信息 ------------------------------------------------------------------------------ [用字符流的 ...
- mysql备份恢复详解
前言 为什么需要备份数据? 数据的备份类型 MySQL备份数据的方式 备份需要考虑的问题 设计合适的备份策略 实战演练 使用cp进行备份 使用mysqldump+复制BINARY LOG备份 使用lv ...
- Python tricks(4) -- with statement
简介 with是从2.5版本引入的一个语法. 这个语法本身是为了解决try..finally繁琐的释放各类资源(文件句柄, Lock等)的问题. 如果想在旧版本中使用这个功能, 直接引入future模 ...