[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大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...
随机推荐
- Wish3D用户必看!模型加载失败原因汇总
上传到Wish3D的模型加载不出来,作品显示页面漆黑一片,是什么原因? 很有可能是操作过程中的小失误,不妨从以下几点检查.还是不行的请加QQ群(Wish3D交流群3):635725654,@Wish3 ...
- angular md-toast 颜色
How to show md-toast with background color https://codepen.io/neilkalman/pen/jWBqve <div ng-contr ...
- Android的包管理机制浅析(二)
上篇刚好说到获取到了签名信息,以下进入安装过程,直接上源代码: private void installNewPackageLI(PackageParser.Package pkg, int pars ...
- 百科知识 epub文件如何打开
.epub 简介 EPub是一个自由的开放标准,属于一种可以"自动重新编排"的内容:也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示.EPub档案内部使用了XHTML或 ...
- Oracle Apex 有用笔记系列 6 - 可编辑交互报告 Editable Interactive Report
据笔者所知.Apex 4.x 是没有提供可编辑交互报告组件的.这就须要我们手动实现. 事实上这也并非非常复杂,仅仅须要简单几步. 1. 依据向导建立一个interactive report.查询语句能 ...
- C 标准库 - <limits.h>
C 标准库 - <limits.h> 简介 limits.h 头文件决定了各种变量类型的各种属性.定义在该头文件中的宏限制了各种变量类型(比如 char.int 和 long)的值. 这些 ...
- cocos2d-x入口类
上一篇文章中有一个在栈中创建的实例--AppDelegate.这个类的初始化使cocos2d-x的程序能够执行起来.由于它是继承于CCApplication类.而执行的run方法就是在此类中实现的. ...
- android等待旋转圆圈动画
先创建一个动画的xml文件例如以下 <? xml version="1.0" encoding="utf-8"?> <animation-li ...
- java基础&&高薪面试
董鹏老师 ,多年经验总结出 [高薪就业必备]之java基础面试题[更新中]: 第01篇 学习Java基础的目的? 第02天 java语言中有没有gotoke ...
- ok6410[002] ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境
ubuntu1604系统下搭配ckermit和dnw基于RAM的裸机程序调试环境 系统: ubuntu16.04 裸板: 飞凌公司OK6410开发板 目标:搭建基于ubuntu1604系统和基于RA ...