动态区间询问kth,单点修改。

区间用线段树分解,线段树上每条线段存一颗平衡树。

不能直接得到kth,但是利用val和比val小的个数之间的单调性,二分值。log^3N。

修改则是一次logN*logN。

总体是Nlog^2N+Mlog^3N。

一个值可以对应多个名次。每次查询严格小于val的个数。

把之前的Treap的值域加了一个vs表示值的出现次数,这样就可以支持重复的val了,并可以统计出值出现次数。

这样每个值的名次就变成一个区间了。

复杂度更低的做法:树状数组套主席树,还不太会。

#include<bits/stdc++.h>
using namespace std; #define PS push
const int maxn = 5e4+;
const int LgN = , maxnds = maxn*LgN; namespace Treap
{
int r[maxnds],s[maxnds],v[maxnds],ch[maxnds][],vs[maxnds];
const int nil = , chsz = sizeof(ch[]);
#define CLRch(x) memset(ch[x],0,chsz);
stack<int> meos;
void Treap_init(){
for(int i = maxnds; --i; ){
meos.PS(i);
}
s[nil] = ;
} inline int newNode(int val){
int i = meos.top(); meos.pop();
r[i] = rand(); v[i] = val;
vs[i] = s[i] = ; CLRch(i)
return i;
} inline void delt(int i) { meos.PS(i); } #define lch ch[o][0]
#define rch ch[o][1] inline void mt(int o){
s[o] = s[lch] + s[rch] + vs[o];
}
inline int cmp(int a,int b){
return a == b?-:(a>b?:);
} inline void rot(int &o,int d){
int k = ch[o][d^];
ch[o][d^] = ch[k][d];
ch[k][d] = o;
mt(o); mt(k);
o = k;
} int qval;
void inst(int &o){
if(!o){
o = newNode(qval);
}else {
int d = cmp(v[o],qval);
if(!~d) {
s[o]++; vs[o]++; return;
}
inst(ch[o][d]);
if(r[ch[o][d]] > r[o]) rot(o,d^);
else mt(o);
}
} void rmov(int &o){
int d = cmp(v[o],qval);
if(!~d){
if(vs[o] > ) {
s[o]--; vs[o]--; return;
}
if(!lch){
delt(o);
o = rch;
}else if(!rch){
delt(o);
o = lch;
}else {
int d2 = r[lch] > r[rch] ? : ;
rot(o,d2);
rmov(ch[o][d2]);
}
}else{
rmov(ch[o][d]);
}
if(o) mt(o);
} void clrTree(int &o){
if(lch) clrTree(lch);
if(rch) clrTree(rch);
delt(o);
o = nil;
}
int Finded;
int Order(int &o){
if(!o) return ;
int d = cmp(v[o],qval);
if(!~d){
Finded += vs[o];
return s[lch];
}else{
return (d?s[lch]+vs[o]:) + Order(ch[o][d]);
}
}
} using namespace Treap; int rt[maxn<<]; int a[maxn];
int n; #define para int o = 1, int l = 1,int r = n
#define lo (o<<1)
#define ro (o<<1|1)
#define TEMP int mid = (l+r)>>1;
#define lsn lo, l, mid
#define rsn ro, mid+1, r
#define insd ql<=l&&r<=qr
int ql,qr,val; void build(para)
{
if(rt[o]) clrTree(rt[o]);
for(int i = l; i <= r; i++){
qval = a[i]; inst(rt[o]);
}
if(l == r) return;
else {
TEMP
build(lsn);
build(rsn);
}
} int query(para)
{
if(insd){
return Order(rt[o]);
}else {
TEMP
int re = ;
if(ql<=mid) re += query(lsn);
if(qr>mid) re += query(rsn);
return re;
}
} int qpos;
void Change(para)
{
qval = a[qpos];
rmov(rt[o]);
qval = val;
inst(rt[o]);
if(l < r){
TEMP
if(qpos <= mid) Change(lsn);
else Change(rsn);
}
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("data.txt","r",stdin);
#endif
int T; scanf("%d",&T);
Treap_init();
while(T--){
int m; scanf("%d%d",&n,&m);
int low = 1e9, high = ;
for(int i = ; i <= n; i++) {
scanf("%d",a+i);
low = min(a[i],low);
high = max(a[i],high);
}
build();
while(m--){
char op[];
int x,y;
scanf("%s%d%d",op,&x,&y);
if(*op == 'Q'){
ql = x; qr = y;
int k; scanf("%d",&k);
int L = low,R = high;
while(L<R){
int M = (L+R+)>>;
qval = M;
Finded = ;
int re = query();
if(k <= re) R = M-;
else if(k > re+Finded) L = M+;
else { L = M; break; }
}
printf("%d\n",L);
}else {
qpos = x;
val = y;
Change();
a[qpos] = y;
low = min(y,low);
high = max(y,high);
}
}
}
return ;
}

ZOJ 2112 Dynamic Rankings(二分,树套树)的更多相关文章

  1. ZOJ - 2112 Dynamic Rankings(BIT套主席树)

    纠结了好久的一道题,以前是用线段树套平衡树二分做的,感觉时间复杂度和分块差不多了... 终于用BIT套函数式线段树了过了,120ms就是快,此题主要是卡内存. 假设离散后有ns个不同的值,递归层数是l ...

  2. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  3. 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings

    题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...

  4. 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)

    SP3946 K-th Number (/2和>>1不一样!!) #include <algorithm> #include <bitset> #include & ...

  5. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  6. zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap

    Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  7. BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings

    以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...

  8. ●ZOJ 2112 Dynamic Rankings

    ●赘述题目 对于一个长为n(n<50000)的序列(序列中的数小于1000000000),现有如下两种指令: Q a b c:询问区间[a,b]中第c小的数. C p b:将序列中的从左往右数第 ...

  9. ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  10. ZOJ 2112 Dynamic Rankings (动态第 K 大)(树状数组套主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

随机推荐

  1. 远程控制Ubuntu系统小结

    一.在远程控制的Ubuntu上,按shift键总会出现中文字符 因为在Ubuntu中,默认启动搜狗输入法,导致在按shift键时,不停出现中文字符 一开始以为是因为远程控制,在主控机和被控机的输入法之 ...

  2. go语言实战教程:项目文件配置和项目初始化运行

    在上节内容中,我们已经搭建了实战项目框架,并将实战项目开发所需要的静态资源文件进行了导入.在本节内容中,我们将讲解如何通过相关的配置,并初始化运行项目. conf配置文件读取配置信息 我们前面说过,使 ...

  3. uva12545 比特变换器(贪心)

    uva12545 比特变换器(贪心) 输入两个等长的串S,T(长度小于100),其中S包含字符0,1,?,T中包含0和1.有三种操作:将S中的0变为1,?变为0或1,交换S中的任意两个字符.求将S变成 ...

  4. bzoj4514: [Sdoi2016]数字配对(费用流)

    传送门 ps:费用流增广的时候费用和流量打反了……调了一个多小时 每个数只能参与一次配对,那么这就是一个匹配嘛 我们先把每个数分解质因数,记质因子总个数为$cnt_i$,那如果$a_i/a_j$是质数 ...

  5. Eclipse项目中乱码问题的解决办法

    一.产生的原因: 1.Http协议进行通信的时候是基于请求和响应的,传输的内容我们称之为报文! 2.Http协议会按照一定的规则将报文编码,然后在读取的时候再使用响应的解码格式进行解码! 3.这个一定 ...

  6. CentOS7.3下Zabbix3.5之微信报警配置

    一.报警脚本放到服务端的 /usr/lib/zabbix/alertscripts/下      属组属主为zabbix zabbix      有执行权限vim weixinbaojing.py # ...

  7. ubuntu16.0.4下修改MySQL的data目录之mysqld启动报错

    由于需要更换MySQL的data目录,更改完成后启动报错如下: apparmor="DENIED" operation="mknod" profile=&quo ...

  8. js 监听浏览器刷新还是关闭事件

    转载大神 http://www.cnblogs.com/gavin0517/p/5827405.html

  9. Jenkins之自动触发部署之插件Generic Webhook Trigger Plugin

    一.安装好插件 二.构建触发器会出现设置trigger的入口 三.设置的两个部分 第一: Jenkins的这个触发器,这里主要是接受post数据.其中Post content parameters是用 ...

  10. 安全性测试入门 (五):Insecure CAPTCHA 验证码绕过

    本篇继续对于安全性测试话题,结合DVWA进行研习. Insecure Captcha不安全验证码 1. 验证码到底是怎么一回事 这个Captcha狭义而言就是谷歌提供的一种用户验证服务,全称为:Com ...