[题目链接]

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. 【转载】GitHub中国区前100名到底是什么样的人

    转载了这篇文章: http://www.jianshu.com/p/d29cba7934c9 这篇文章真是太牛了!转载过来涨涨见识,同时好好励志一把.还有,ruanyifeng怎么长那样... 哈 另 ...

  2. Eclipse出现&quot;Running Android Lint has encountered a problem&quot;解决方式

    近期打开Eclipse的时候,总是发生这种一个错误:"Running Android Lint has encountered a problem".截图例如以下: . 可是Ecl ...

  3. SQL中Inserted 和Deleted表 以及触发Trigger

    什么是Inserted 和Deleted表 他们有什么用 trigger 的简单实用 1.什么是Inserted 和Deleted表 当插入数据的时候,其实是同时向目的表 和inserted表中插入数 ...

  4. Perl图书的一些体会

    近期,由于项目须要.又又一次将Perl学习起来. Perl老实说.让我又爱又恨. 爱它.是由于自己写代码的确非常爽. 是代码最少.速度最快的语言. 恨是由于看别人的代码实在太累了. 但,整体体会,在文 ...

  5. linux查看磁盘信息

    linux查看磁盘挂载信息:df -hlinux查看文件夹大小:sudo du -h --max-depth=1

  6. Codeforces Round #267 (Div. 2) B. Fedor and New Game

    After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...

  7. centos7下memcached的安装配置

    memcached 依赖 libevent-devel 首先安装libevent-devel yum -y install libevent-devel 安装完毕! 继续安装memcached yum ...

  8. PHP date()获取系统时间不对

    使用date_default_timezone_set(”)方法; <?php error_reporting(0); date_default_timezone_set('PRC'); hea ...

  9. JQuery日记 5.31 JQuery对象的生成

    JQuery对象的生成 1 selector为不论什么可转换false的空值   返回空JQuery对象 2 selector为字符串   2.1 selector为html字符串或有id属性的标签 ...

  10. Drupal 初次使用感受,兴许补充。

    非常久曾经就接触过.下载下来安装,结果界面太丑,太难看,直接删除. 近期又一次想到开源CMS,好奇看到那么多人推崇drupal.也便下载来又一次研究了下. 刚接触了下.只是总体使用感觉非常差.尤其几个 ...