Bzoj1901 Dynamic Ranking
动态区间第k小
离散化后
那么每个点开一棵线段树(主席树)再套一个树状数组在外面
每次询问区间内的树的个数时
相当于进行了一次树状数组求区间和的操作,只是是把树状数组那个点看做主席树,对log棵主席树求区间和
然后每次询问,修改时就是把log棵主席树同时跳到儿子,修改也是log棵
时间复杂度O(nlogn*logn)空间复杂度O(nlogn*logn)
# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(2e4 + 10), __(2e6 + 10);
IL ll Read(){
RG char c = getchar(); RG ll x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int n, m, len, p[_], a[_], ql[_], qr[_], qk[_], qo[_];
int ls[__], rs[__], sz[__], rt[__], num, tmp[2][20];
IL void Modify(RG int &x, RG int l, RG int r, RG int pos, RG int val){
if(!x) x = ++num;
sz[x] += val;
if(l == r) return;
RG int mid = (l + r) >> 1;
if(pos <= mid) Modify(ls[x], l, mid, pos, val);
else Modify(rs[x], mid + 1, r, pos, val);
}
IL void PreModify(RG int x, RG int val){
RG int k = lower_bound(p + 1, p + len + 1, a[x]) - p;
for(RG int i = x; i <= n; i += i & -i) Modify(rt[i], 1, len, k, val);
}
IL int Query(RG int l, RG int r, RG int k){
if(l == r) return l;
RG int mid = (l + r) >> 1, sum = 0;
for(RG int i = 1; i <= tmp[1][0]; i++) sum += sz[ls[tmp[1][i]]];
for(RG int i = 1; i <= tmp[0][0]; i++) sum -= sz[ls[tmp[0][i]]];
if(k <= sum){
for(RG int i = 1; i <= tmp[1][0]; i++) tmp[1][i] = ls[tmp[1][i]];
for(RG int i = 1; i <= tmp[0][0]; i++) tmp[0][i] = ls[tmp[0][i]];
return Query(l, mid, k);
}
else{
for(RG int i = 1; i <= tmp[1][0]; i++) tmp[1][i] = rs[tmp[1][i]];
for(RG int i = 1; i <= tmp[0][0]; i++) tmp[0][i] = rs[tmp[0][i]];
return Query(mid + 1, r, k - sum);
}
}
IL int PreQuery(RG int l, RG int r, RG int k){
Fill(tmp, 0);
for(RG int i = r; i; i -= i & -i) tmp[1][++tmp[1][0]] = rt[i];
for(RG int i = l - 1; i; i -= i & -i) tmp[0][++tmp[0][0]] = rt[i];
return Query(1, len, k);
}
int main(RG int argc, RG char* argv[]){
n = Read(); m = Read();
for(RG int i = 1; i <= n; i++) a[i] = Read(), p[++len] = a[i];
for(RG int i = 1; i <= m; i++){
RG char c; scanf(" %c", &c);
qo[i] = c == 'Q';
if(qo[i]) ql[i] = Read(), qr[i] = Read(), qk[i] = Read();
else ql[i] = qr[i] = Read(), qk[i] = Read(), p[++len] = qk[i];
}
sort(p + 1, p + len + 1); len = unique(p + 1, p + len + 1) - p - 1;
for(RG int i = 1; i <= n; i++) PreModify(i, 1);
for(RG int i = 1; i <= m; i++)
if(qo[i]) printf("%d\n", p[PreQuery(ql[i], qr[i], qk[i])]);
else{
PreModify(ql[i], -1);
a[ql[i]] = qk[i];
PreModify(ql[i], 1);
}
return 0;
}
Bzoj1901 Dynamic Ranking的更多相关文章
- 【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)
[BZOJ1901][Luogu2617]Dynamic Ranking(主席树,树状数组) 题面 神TM BZOJ权限题 Luogu真良心 题解 如果不考虑修改 很容易的主席树区间第K大 考虑修改 ...
- AC日记——Dynamic Ranking 洛谷 P2617
Dynamic Ranking 思路: 可持久化树状数组: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
- 【bzoj1901】dynamic ranking(带修改主席树/树套树)
题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...
- 【bzoj1901】dynamic ranking(带修改主席树)
传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...
- 洛谷 P2617 Dynamic Ranking
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- P2617 Dynamic Ranking
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings
题意:n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y 代表将(从左往右数)第x个数变成y 上篇介绍了在 ...
- BZOJ1901 - Dynamic Rankings(树状数组套主席树)
题目大意 给定一个有N个数字的序列,然后又m个指令,指令种类只有两种,形式如下: Q l r k 要求你查询区间[l,r]第k小的数是哪个 C i t 要求你把第i个数修改为t 题解 动态的区间第k ...
- 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)
洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...
随机推荐
- Linux知识体系之路径属性与目录
最近在看鸟哥的Linux私房菜,我觉得这本书还是很不错的.这里进行相关的总结. 1.Linux目录权限概念 Linux一般讲目录可存取的方式分为三个类别,分别是owner/group/other, ...
- ZK客户端脚本的简单使用
sh zkCli.sh [-server ip:port] :连接节点zk客户端[-server ip:port 用于连接集群中指定节点的客户端] 1.创建节点 create [-s] [-e] pa ...
- Java经典编程题50道之十六
输出九九乘法表. public class Example16 { public static void main(String[] args) { table(9); } ...
- 【转】磁盘I/O那些事
背景 计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代.然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时 ...
- Sphinx下载、安装、配置、Hello World、文档阅读
sphinx下载.安装.配置.Hello World.查看文档
- 微信小程序半周问题总结
新产品要做一个微信小程序,不想吐槽老板没给任何准备就给出了需求和原型图,好像默认小程序闭着眼睛就可以很顺利开发好.现在半周下来(五一结束开始到今天)完成了差不多所有的界面,网络请求部分还跟服务端兄弟耗 ...
- xBIM WeXplorer 设置模型颜色
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...
- eclipse中maven的run as打war包失败的问题
场景一: 由于某些原因,有的时候需要暂时在断网的情况下,或者更标准的说,是在连不上公司的maven公有仓库的情况下打包. 很长一段时间,我打包都是在eclipse中用run as在线打包,直到前不久一 ...
- Android中Java和JavaScript交互
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如 ...
- Java中过滤出字母、数字和中文的正则表达式
1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2)过滤出数字的正则表达式 [^(0-9)] (3)过滤出中文的正则表达式 [^(\\u4e0 ...