动态区间询问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. 浅谈JavaScript -- 正则表达式

    什么是正则表达式? 正则表达式是由一个字符序列形成的搜索模式.可用于文本搜索和文本替换. 语法:/正则表达式主体/修饰符(可选) var patt=new RegExp(pattern,modifie ...

  2. CTO成长之路分享会

    1. 李宏玮,纪源资本合伙人GGV,设计无人机,典型的投资: VC做投资,收入利润上市技术团队,架构支撑前沿科技,以后牛逼公司以技术为主 2. 小红书tiger2003加入谷歌,之前学phpgoogl ...

  3. 菜鸟眼中的”AppSettings和ConnectionStrings“

    前言 这次的机房收费系统重构,我们用到了这个配置文件.瞬间感觉高大上了许多,对新鲜的事务就是又陌生又好奇,通过看静静的博客,还有自己查资料花了点时间弄了弄,下面是我整理的结果. 内容 是什么 AppS ...

  4. sg函数和nim游戏的关系

    sg函数和nim游戏的关系 本人萌新,文章如有错漏请多多指教-- 我在前面发了关于nim游戏的内容,也就是说给n堆个数不同的石子,每次在某个堆中取任意个数石子,不能取了就输了.问你先手是否必胜.然后只 ...

  5. Maven中常用插件的配置

    在Maven项目的pom.xml文件中配置插件信息,使用<build></build>标签 1.配置JDK版本插件和Tomcat版本插件 <build> <! ...

  6. ELK(+Redis)-开源实时日志分析平台

    ################################################################################################### ...

  7. express知识点

    本篇文章主要内容 1.用Express在系统文件夹内搭建一个服务器 2.Express的路由(来自 Express 文档) 3.Express的中间件(这才是关键) 4.Express的一些零碎的知识 ...

  8. Linux命令发送Http的get或post请求(curl和wget两种方法)

    Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求.下面就来介绍一下Linux系统如何模拟Http ...

  9. java多线程,如何防止脏读数据

    多线程容易“非线程安全”的情况,是由于用了全局变量,而又没有很好的控制起情况.所以无论做什么程序,谨慎使用全局变量 "非线程安全"其实会在多个线程对同一个对象中的实例变量进行并发访 ...

  10. Spring和springMVC父子容器的关系

    部分转载自:https://www.cnblogs.com/ljdblog/p/7461854.html springMVC容器和Spring容器 为什么一定要在web.xml中配置spring的li ...