动态区间第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的更多相关文章

  1. 【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)

    [BZOJ1901][Luogu2617]Dynamic Ranking(主席树,树状数组) 题面 神TM BZOJ权限题 Luogu真良心 题解 如果不考虑修改 很容易的主席树区间第K大 考虑修改 ...

  2. AC日记——Dynamic Ranking 洛谷 P2617

    Dynamic Ranking 思路: 可持久化树状数组: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  3. 【bzoj1901】dynamic ranking(带修改主席树/树套树)

    题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...

  4. 【bzoj1901】dynamic ranking(带修改主席树)

    传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...

  5. 洛谷 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≤ ...

  6. 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≤ ...

  7. [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings

    题意:n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y    代表将(从左往右数)第x个数变成y 上篇介绍了在 ...

  8. BZOJ1901 - Dynamic Rankings(树状数组套主席树)

    题目大意 给定一个有N个数字的序列,然后又m个指令,指令种类只有两种,形式如下: Q l r k 要求你查询区间[l,r]第k小的数是哪个 C i t  要求你把第i个数修改为t 题解 动态的区间第k ...

  9. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

随机推荐

  1. PLECS—晶闸管-第九周

    1. 单相桥式晶闸管整流电路仿真 (1)仿真电路图 (2)触发角为pi/4的手工波形图(参数设置,触发角=pi/4, 电感L = 0H) (2)模拟仿真波形图 1)参数设置:触发角=pi/4, 电感L ...

  2. iOS 开发之 Xcode installation failed invalid argument!

    1.运行模拟器的时候 报出:installation failed invalid argument! 原因分析:我把Bundle indentifier 置为空了! http://stackover ...

  3. [POJ 3581]Sequence

    [POJ 3581]Sequence 标签: 后缀数组 题目链接 题意 给你一串序列\(A_i\),保证对于$ \forall i \in [2,n],都有A_1 >A_i$. 现在需要把这个序 ...

  4. mybatis like条件添加%的方法

    使用 MySQL可以使用CONCAT函数.例: <if test="userName != null and userName != ''"> and user_nam ...

  5. Python标准异常总结

    Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性  EOFError 用户输入文件末尾标志EOF(Ctrl+d ...

  6. js的call和apply拾遗

    一.产生背景 1. JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念 2.正因为上下文的不同所以call 和 apply 都是为了改变某个函数运行 ...

  7. 关于 JS 拖拽功能的冲突问题及解决方法

    前言 我在之前写过关于 JS 拖拽的文章,实现方式和网上能搜到的方法大致相同,别无二致,但是在一次偶然的测试中发现,这种绑定事件的方式可能会和其它的拖拽事件产生冲突,由此产生了对于事件绑定的思考.本文 ...

  8. Windows API Finishing

    input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...

  9. java线程间通信1--简单实例

    线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...

  10. 剑指offer第七天

    30.连续子数组的最大和 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决 ...