[ZJU 2112] Dynamic Rankings
[题目链接]
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的更多相关文章
- BZOJ 1901 Zju 2112 Dynamic Rankings 与更改的树董事长
标题效果:给定一个序列,单点变化,询价区间k大. 思维:假设没有变化.然后划分树就可以解决,但树的分工仍然是一棵树,它不支持的变化. 主席舒变化实际上是在外带fenwick右护套层值段树,但正确的值线 ...
- 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings
题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...
- ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)
题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...
- 主席树[可持久化线段树](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 ...
- 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)
SP3946 K-th Number (/2和>>1不一样!!) #include <algorithm> #include <bitset> #include & ...
- ZOJ 2112 Dynamic Rankings(主席树の动态kth)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings ...
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大
Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...
随机推荐
- xgboost的SparkWithDataFrame版本实现
再xgboost的源码中有xgboost的SparkWithDataFrame的实现,如下:https://github.com/dmlc/xgboost/tree/master/jvm-packag ...
- 搭建windows下的odoo开发环境
odoo运行环境的必须要要求是 python环境 postgreSQL数据 数据库可以安装在别的机器上,比如服务器:当然对于开发环境,通常,数据库与代码调试安装在同一台机器上. 首先安装 postgr ...
- Python中的列表、元祖、字典
一.列表 一组有序项目的集合.可变的数据类型[可进行增删改查] 列表是以方括号"[]"包围的数据集合,不同成员以","分隔. 列表中能够包括不论什么数据类型,也 ...
- 串匹配算法之BM算法
参考资料: http://blog.csdn.net/eric491179912/article/details/6210009 http://blog.163.com/pengfeicui@ye ...
- 音频单元组件服务参考(Audio Unit Component Services Reference)
目录 了解Audio Unit体系结构 文档结构预览 结构单元介绍 本文主要介绍AudioUnit的组成 本文由自己理解而成,如有错误,请欢迎网友们指出校正. 了解Audio Unit体系结构 开始前 ...
- 笔记09 WS,WCF
http://blog.csdn.net/avi9111/article/details/5655563 http://www.cnblogs.com/tearer/archive/2013/04/2 ...
- Ubuntu 15.10
安装Ubuntu 15.10后要做的事 http://blog.csdn.net/skykingf/article/details/45267517 ubuntu15.10 install-mac-t ...
- gulp css html image js 合并压缩
安装node.js npm 以及安装gulp等方法我就不在这里赘述了. 接下里我主要介绍的是Gulpfile文件里面的配置该如何书写. var gulp = require('gulp');//引 ...
- opencv中的SVM图像分类(二)
opencv中的SVM图像分类(二) 标签: svm图像 2015-07-30 08:45 8296人阅读 评论(35) 收藏 举报 分类: [opencv应用](5) 版权声明:本文为博主原创文 ...
- 制作一个塔防游戏 Cocos2d-x 2.1.4 (一)
在这篇文章,将会学习到怎样制作一个塔防游戏.在这其中,学习怎样在设定的时间内出现一波波的敌人,使这些敌人沿着指定的路点前进.怎样在地图上指定的位置创建炮塔.怎样使炮塔射击敌人,怎样可视化调试路点和炮塔 ...