[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1901

[算法]

首先 , 考虑没有修改操作

不妨建立可持久化线段树 , 第i棵树维护区间[1 , i]中的数的出现个数 , 则可以通过在线段树上二分的方式求出答案

那么 , 若有修改操作 , 我们不妨使用树状数组套可持久化线段树

树状数组中的第i个元素为一棵可持久化线段树 , 代表区间[i , i - lowbit(i) + 1]每个数的出现次数

询问时可以同样二分 , 只需用最多log(N)棵线段树作差即可

时间复杂度 : O(NlogN ^ 2)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
#define MAXP 5000010
#define MAXLOG 20
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; int n , m , len , L , R;
int a[MAXN] , root[MAXN] , val[MAXN] , x[MAXN] , y[MAXN] , l[MAXN] , r[MAXN] , k[MAXN] , ql[MAXLOG] , qr[MAXLOG];
char type[MAXN][]; struct Presitent_Segment_Tree
{
int sz;
int sum[MAXP] , lson[MAXP] , rson[MAXP];
Presitent_Segment_Tree()
{
sz = ;
memset(root , , sizeof(root));
memset(lson , , sizeof(lson));
memset(rson , , sizeof(rson));
}
inline void modify(int &k , int old , int l , int r , int pos , int value)
{
k = ++sz;
lson[k] = lson[old] , rson[k] = rson[old];
sum[k] = sum[old] + value;
if (l == r) return;
int mid = (l + r) >> ;
if (mid >= pos) modify(lson[k] , lson[k] , l , mid , pos , value);
else modify(rson[k] , rson[k] , mid + , r , pos , value);
}
inline int query(int l , int r , int k)
{
int cnt = ;
if (l == r)
return l;
for (int i = ; i <= L; i++) cnt -= sum[lson[ql[i]]];
for (int i = ; i <= R; i++) cnt += sum[lson[qr[i]]];
int mid = (l + r) >> ;
if (cnt >= k)
{
for (int i = ; i <= L; i++) ql[i] = lson[ql[i]];
for (int i = ; i <= R; i++) qr[i] = lson[qr[i]];
return query(l , mid , k);
} else
{
for (int i = ; i <= L; i++) ql[i] = rson[ql[i]];
for (int i = ; i <= R; i++) qr[i] = rson[qr[i]];
return query(mid + , r , k - cnt);
}
}
} PST;
struct Binary_Indexed_Tree
{
inline int lowbit(int x)
{
return x & (-x);
}
inline void modify(int pos , int x , int val)
{
for (int i = pos; i <= n; i += lowbit(i))
PST.modify(root[i] , root[i] , , len , x , val);
}
inline int query(int l , int r , int k)
{
L = , R = ;
for (int i = l - ; i; i -= lowbit(i))
ql[++L] = root[i];
for (int i = r; i; i -= lowbit(i))
qr[++R] = root[i];
return PST.query( , len , k);
}
} BIT; template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
} int main()
{ scanf("%d%d" , &n , &m);
len = n;
for (int i = ; i <= n; i++)
{
scanf("%d" , &a[i]);
val[i] = a[i];
}
for (int i = ; i <= m; i++)
{
scanf("%s" , type[i]);
if (type[i][] == 'C')
{
scanf("%d%d" , &x[i] , &y[i]);
val[++len] = y[i];
} else
scanf("%d%d%d" , &l[i] , &r[i] , &k[i]);
}
sort(val + , val + len + );
len = unique(val + , val + len + ) - val - ;
for (int i = ; i <= n; i++) a[i] = lower_bound(val + , val + len + , a[i]) - val;
for (int i = ; i <= m; i++)
if (type[i][] == 'C') y[i] = lower_bound(val + , val + len + , y[i]) - val;
for (int i = ; i <= n; i++) BIT.modify(i , a[i] , );
for (int i = ; i <= m; i++)
{
if (type[i][] == 'C')
{
BIT.modify(x[i] , a[x[i]] , -);
BIT.modify(x[i] , y[i] , );
a[x[i]] = y[i];
} else printf("%d\n" , val[BIT.query(l[i] , r[i] , k[i])]);
} return ;
}

[ZJU 2112] Dynamic Rankings的更多相关文章

  1. BZOJ 1901 Zju 2112 Dynamic Rankings 与更改的树董事长

    标题效果:给定一个序列,单点变化,询价区间k大. 思维:假设没有变化.然后划分树就可以解决,但树的分工仍然是一棵树,它不支持的变化. 主席舒变化实际上是在外带fenwick右护套层值段树,但正确的值线 ...

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

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

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

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

  4. 主席树[可持久化线段树](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 ...

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

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

  6. ZOJ 2112 Dynamic Rankings(主席树の动态kth)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings ...

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

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

  8. ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)

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

  9. ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大

    Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...

随机推荐

  1. 手把手教你如何利用Meterpreter渗透Windows系统

    在这篇文章中,我们将跟大家介绍如何使用Meterpreter来收集目标Windows系统中的信息,获取用户凭证,创建我们自己的账号,启用远程桌面,进行屏幕截图,以及获取用户键盘记录等等. 相关Payl ...

  2. sql的一些知识_高级

    1.视图 http://www.cnblogs.com/wang666/p/7885934.html 2.存储过程 http://www.cnblogs.com/wang666/p/7920748.h ...

  3. Toolbar的使用.md

    1.什么是Toolbar Toolbar是在Android5.0时出现的一个新控件,其目的用于取代Actionbar,它与Actionbar最大的差别就是Toolbar使用更加灵活.自由,而且Tool ...

  4. Android 音频的播放之二MediaPlayer

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于怎样使用这个类的方法还能够阅读VideoView类的文档. 1.状态图 对播放音频/视频文件和流的控制是通过一个状态机来管理的. 下图显 ...

  5. soapUI学习笔记---断言的小使用

    转自:http://www.cnblogs.com/duimianyoushan/p/4274791.html 以下示例在soapUI 4.5中进行.刚开始学soapUI的使用,记录下以免忘记 1.创 ...

  6. unix改变shell显示颜色

    编写shell脚本的时候.通过改变shell的显示颜色,不但可以改变使用shell终端的体验,并且更为有用的是,可以通过改变显示内容的颜色来区分正常输出.warning和error等不同关注级别的输出 ...

  7. surface 通过U盘 镜像恢复系统

    1. 在恢复之前首先要解锁bitlocker(如果你的surface没有加锁就不需要这个步骤) 在另一台电脑上登录bitlocker锁绑定的微软账号,查询密钥,在需要的地方输入这个密钥(不经过这个操作 ...

  8. Windows 10遭遇百万粉丝“围攻”(挑刺)

    9月30日,微软公布Win 10技术预览版,征求反馈意见. 出人意料的是.截止10月14日.在短短两周内,竟有百万粉丝下载试用(所谓"測试"),反馈了20万条改动意见.对此,微软真 ...

  9. POJ 3580(SuperMemo-Splay区间加)[template:Splay V2]

    SuperMemo Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11384   Accepted: 3572 Case T ...

  10. 关于arr.map()问题

    最近看map实现原理, Array.prototype._map = function(fn, context) { console.log(fn, context) var temp = []; i ...