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 ...
随机推荐
- Bootstrap 网格系统(Grid System)实例2
Bootstrap 网格系统(Grid System):堆叠水平,两种样式 <!DOCTYPE html><html><head><meta http-equ ...
- UISearchBar的应用
当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...
- iOS 第三方类库之MBProgressHUD
github链接地址 MBProgressHUD是一个开源的第三方类库实现了很多种样式的提示框,类似Activity indicator,使用上简单.方便,并且可以对显示的内容进行自定义,功能很强大, ...
- 661. Image Smoother@python
Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...
- 学习笔记之30个常用的maven命令
maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下, -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试: -P 指定 ...
- js最高效的数组去重方法
var arr=[1,2,33,2,4,5,33,5,7,8,1,3];var result=[];var temp={};for( var i=0;i<arr.length;i++){ if( ...
- Java的BigDecimal容易出现的坑
BigDecimal一般是用来做要求比较高的精准计算的.前几天在使用的时候遇到一个大坑,记录下. 这个问题产生是使用BigDecimal做除法(divide)运算,这个类的divide方法存在三个常用 ...
- 【08】css sprite是什么,有什么优缺点
[08]css sprite是什么?有什么优缺点? 概念:将多个小图片拼接到一个图片中.通过background-position和元素尺寸调节需要显示的背景图案. 优点: 减少HTTP请求数,极大地 ...
- appium+python自动化-adb shell模拟点击事件(input tap)
前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...
- appium之android_uiautomator定位
前言 appium就是封装android的uiautomator这个框架来的,所以uiautomator的一些定位方法也可以用 text 1.通过text文本定位语法 new UiSelector() ...