ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】
题目链接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112
题意:
求动态区间第K大。
分析:
把修改操作看成删除与增加,对所有操作进行整体二分。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define pr(x) cout << #x << ": " << x << " "
#define pl(x) cout << #x << ": " << x << endl;
const int maxn = 50000 + 5, maxq = 20000 + 5, oo = 0x3f3f3f3f;
int n, m, tot;
int a[maxn];
struct Query{
int x, y, k;
int id, type;
}q[maxn + maxq], q1[maxn + maxq], q2[maxn + maxq];
int bit[maxn];
int ans[maxq];
void add(int i, int x)
{
while(i <= n){
bit[i] += x;
i += i & -i;
}
}
int sum(int i)
{
int ans = 0;
while(i > 0){
ans += bit[i];
i -= i & -i;
}
return ans;
}
void solve(int ql, int qr, int l, int r)
{
if(ql > qr) return ;
if(l == r){
for(int i = ql; i <= qr; i++){
if(q[i].type == 2) ans[q[i].id] = l;
}
return ;
}
int t1 = 0, t2 = 0;
int mid = l + r >> 1;
// pl(mid);
for(int i = ql; i <= qr; i++){
if(q[i].type == 1){
if(q[i].x <= mid){
add(q[i].id, q[i].y);
q1[t1++] = q[i];
}else q2[t2++] = q[i];
}else{
int tmp = sum(q[i].y) -sum(q[i].x - 1);
if(tmp >= q[i].k) q1[t1++] = q[i];
else {
q[i].k -= tmp;
q2[t2++] = q[i];
}
}
}
for(int i = 0; i < t1; i++){
if(q1[i].type == 1) add(q1[i].id, -q1[i].y);
}
for(int i = 0; i < t1; i++) q[ql + i] = q1[i];
for(int i = 0; i < t2; i++) q[t1 + i + ql] = q2[i];
solve(ql, ql + t1 - 1, l, mid);
solve(ql + t1, qr, mid + 1, r);
}
int main (void)
{
int x;scanf("%d", &x);
while(x--){
scanf("%d%d", &n, &m);
tot = 0;
memset(bit, 0, sizeof(bit));
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
q[++tot] = (Query){a[i], 1, oo, i, 1};
}
char s[2];
int x, y, k;
int cnt = 0;
for(int i = 1; i <= m; i++){
scanf("%s%d%d", s, &x, &y);
if(s[0] == 'Q'){
scanf("%d", &k);
q[++tot] = (Query){x, y, k, ++cnt, 2};
}else{
q[++tot] = (Query){a[x], -1, oo, x, 1};
q[++tot] = (Query){y, 1, oo, x, 1};
}
}
solve(1, tot, 0, oo);
for(int i = 1; i <= cnt; i++){
printf("%d\n", ans[i]);
}
}
return 0;
}
ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】的更多相关文章
- 51nod 1175 区间第k大 整体二分
题意: 一个长度为N的整数序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,第K大的数是多少. 分析: 仅仅就是一道整体二分的入门题而已,没听说过整体二分? 其实就是一个分治的函数 ...
- ZOJ2112 Dynamic Rankings 动态区间第K最值 平方分割
有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁 ...
- ZOJ2112--Dynamic Rankings (动态区间第k大)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)
题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...
- hdu5412(动态区间第k大)
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- 动态区间第K大
整体二分. 主要需要注意的一点是,对于每个删除操作,若删除操作被算入贡献,则最开始的插入操作也一定会被算入,所以不必担心删除删错. #include<cstdio> #include< ...
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
随机推荐
- Difference between x:Reference and x:Name
{x:Reference ...} -> returns just a reference of an object it doesn't create that "bridge&qu ...
- javaEE(2)_http协议
一.HTTP协议简介 1.客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式.dos环境下可直接通过telnet ...
- React项目搭建及依赖安装
一.前提 首先保证node.js已安装完成... 安装完成后,打开cmd命令行,输入 node -v 和 npm -v 来查看版本号,如果显示则安装完成. 二.安装react脚手架 在cmd命令行中输 ...
- 《零基础入门学习Python》【第一版】视频课后答案第006讲
python中被看作假:FALSE none 0 ‘ ’ " " ( ) [ ] { },其他一切都被解释为真 测试题答案: 0.Python 的 floor 除法现在使用 ...
- [转载] Python数据类型知识点全解
[转载] Python数据类型知识点全解 1.字符串 字符串常用功能 name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.c ...
- 快捷键,命令之tab/ history / alias / ls / cd / mkdir / touch /tree /cp /mv /rm /cat /head/grep
第一阶段 快捷键 1 第二阶段 文件和目录操作命令 1 1.1 date / useradd 1 1.2 echo 调用变量 2 1.3 whoami 查看用户名 2 1.4 tab命令补全 2 1. ...
- DNS 网关 子网掩码介绍
DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机 ...
- HDU 3480 DP 斜率优化 Division
把n个数分成m段,每段的值为(MAX - MIN)2,求所能划分得到的最小值. 依然是先从小到大排个序,定义状态d(j, i)表示把前i个数划分成j段,所得到的最小值,则有状态转移方程: d(j, i ...
- HTML、CSS知识点总结_D
一,html+css基础 1-1 Html和CSS的关系 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTM ...
- cf950f Curfew
神贪心--写了一个晚上加一个早上. 先考虑只有一个宿管的情况. 首先,如果这个宿舍人多了,多余的人就跑到下一个宿舍.(如果这是最后一个宿舍的话,多的就躺床底下) 如果这个宿舍人少了,但是能从别的宿舍调 ...