The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply find the k-th smallest number of the given N numbers. They have developed a more powerful system such that for N numbers a[1], a[2], ..., a[N], you can ask it like: what is the k-th smallest number of a[i], a[i+1], ..., a[j]? (For some i<=j, 0<k<=j+1-i that you have given to it). More powerful, you can even change the value of some a[i], and continue to query, all the same.

Your task is to write a program for this computer, which

- Reads N numbers from the input (1 <= N <= 50,000)

- Processes M instructions of the input (1 <= M <= 10,000). These instructions
include querying the k-th smallest number of a[i], a[i+1], ..., a[j] and change
some a[i] to t.

Input

The first line of the input is a single number X (0 < X <= 4), the number
of the test cases of the input. Then X blocks each represent a single test case.

The first line of each block contains two integers N and M, representing N numbers
and M instruction. It is followed by N lines. The (i+1)-th line represents the
number a[i]. Then M lines that is in the following format

Q i j k or
C i t

It represents to query the k-th number of a[i], a[i+1], ..., a[j] and change
some a[i] to t, respectively. It is guaranteed that at any time of the operation.
Any number a[i] is a non-negative integer that is less than 1,000,000,000.

There're NO breakline between two continuous test cases.

Output

For each querying operation, output one integer to represent the result. (i.e.
the k-th smallest number of a[i], a[i+1],..., a[j])

There're NO breakline between two continuous test cases.

Sample Input

2
5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6
3
6

【分析】

裸题,不说了。

按照这种方法的话,离线的带插入修改区间第K大也应该可以做了。

不过这题的经典作法是树状数组上套可持久化线段树,不过这样空间消耗会很大。

可能要用动态开点?

转一个用块状链表的:http://www.cnblogs.com/zhj5chengfeng/archive/2013/08/19/3268162.html

 /*
宋代晏殊
《蝶恋花·槛菊愁烟兰泣露》 槛菊愁烟兰泣露。罗幕轻寒,燕子双飞去。明月不谙离恨苦。斜光到晓穿朱户。
昨夜西风凋碧树。独上高楼,望尽天涯路。欲寄彩笺兼尺素。山长水阔知何处。
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
#include <iomanip>
#include <string>
#include <cmath>
#include <queue>
#include <assert.h>
#include <map>
#include <ctime>
#include <cstdlib>
#include <stack>
#define LOCAL
const int INF = ;
const int MAXN = + ;
using namespace std;
struct QUERY{
int x, y;
int k, s, type, cur;//cur用来记录前面的值
}q[MAXN], q1[MAXN], q2[MAXN];
int Ans[MAXN];
int tmp[MAXN], c[MAXN];
int n, m, num, cnt;
int data[MAXN]; inline int lowbit(int x){return x&-x;}
void add(int x, int val){
while (x <= n){
c[x] += val;
x += lowbit(x);
}
return;
}
int sum(int x){
int cnt = ;
while (x > ){
cnt += c[x];
x -= lowbit(x);
}
return cnt;
}
//整体二分
void solve(int l, int r, int L, int R){
//这两个都是结束条件
if (l > r) return;
if (L == R){//更新答案
for (int i = l; i <= r; i++)
if (q[i].type == ) Ans[q[i].s] = L;
return;
}
int mid = (L + R) >> ;
for (int i = l; i <= r; i++){
if (q[i].type == && q[i].y <= mid) add(q[i].x, );
else if (q[i].type == && q[i].y <= mid) add(q[i].x, -);
else if (q[i].type == ) tmp[i] = sum(q[i].y) - sum(q[i].x - );
}
//更新完了就要清除标记了
for (int i = l; i <= r; i++){
if (q[i].type == && q[i].y <= mid) add(q[i].x, -);
else if (q[i].type == && q[i].y <= mid) add(q[i].x, );
}
int l1 = , l2 = ;
for (int i = l; i <= r; i++){
if (q[i].type == ){
//不用id就直接改
if (q[i].cur + tmp[i] > q[i].k - ) q1[++l1] = q[i];
else {
q[i].cur += tmp[i];
q2[++l2] = q[i];
}
}else{
if (q[i].y <= mid) q1[++l1] = q[i];
else q2[++l2] = q[i];
}
}
for (int i = ; i <= l1; i++) q[i + l - ] = q1[i];
for (int i = ; i <= l2; i++) q[i + l1 + l - ] = q2[i];
solve(l, l + l1 - , L, mid);
solve(l + l1, r, mid + , R);
}
void init(){
memset(c, , sizeof(c));
cnt = num = ;//指针初始化,num记录总的操作数量
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++){
num++;
scanf("%d", &data[i]);
q[num].x = i;q[num].type = ;//1代表插入
q[num].s = ;q[num].y = data[i];//没有用y就当val用
}
for (int i = ; i <= m; i++){
char str[];
num++;
scanf("%s", str);
if (str[] == 'Q'){
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
q[num].x = l;q[num].y = r;
q[num].type = ; q[num].s = ++cnt;
q[num].k = k;
}else{
int l, x;
scanf("%d%d", &l, &x);
q[num].x = l;q[num].y = data[l];//2为删除
q[num].type = ;q[num].s = ;
q[++num].x = l;
q[num].y = x;//删除后插入
q[num].type = ;
q[num].s = ;
data[l] = x;//注意这里一定要改,不然会影响到后面的更新
}
}
for (int i = ; i <= num; i++) q[i].cur = ;
} int main(){
int T; scanf("%d", &T);
while (T--){
init();
solve(, num, , INF);
for (int i = ; i <= cnt; i++) printf("%d\n", Ans[i]);
}
return ;
}

【ZOJ2112】【整体二分+树状数组】带修改区间第k大的更多相关文章

  1. 主席树套树状数组——带修区间第k大zoj2112

    主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...

  2. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  3. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  4. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  5. 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

    题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...

  6. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  7. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

  8. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

  9. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

随机推荐

  1. Linux Shell编程(13)——数字常量

    除非一个数字有特别的前缀或符号,否则shell脚本把它当成十进制的数.一个前缀为0的数字是八进制数.一个前缀为0x的数字是十六进制数.一个数用内嵌的#来求值则看成BASE#NUMBER(有范围和符号限 ...

  2. CMD打开远程并使用空白密码远程登录

    记录一下,在单位管理局域网机器时 写出的小程序: 应用场景:比如异地A的局域网内主机需要远程登录进入系统调试,而A电脑的Radmin之类的远程控制软件无效,就只能使用操作系统自带的远程桌面功能,而,异 ...

  3. Unity Chan Advanced

    1. 8X MSAA 2. SMAA 3. ViewSpace Outline 4. Unity Chan Skin 5. Shift Toon Lighting 6. DOF 7. Bloom

  4. POJ 1503 Integer Inquiry 简单大数相加

    Description One of the first users of BIT's new supercomputer was Chip Diller. He extended his explo ...

  5. Android学习笔记(二)Manifest文件节点详解

    在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文件最基本的结构: <manifest ...

  6. [Git] Github上传新repository后自动合并

    原因是新repository中有个与老repository一模一样的名字为".git"的隐藏文件夹,删去后即可: 将整个工程直接复制粘贴出此错误...好蠢: Github控制项目的 ...

  7. 谈一下怎样设计Oracle 分区表

    在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,全部数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...

  8. virtualbox 虚拟3台虚拟机搭建hadoop集群

    用了这么久的hadoop,只会使用streaming接口跑任务,各种调优还不熟练,自定义inputformat , outputformat, partitioner 还不会写,于是干脆从头开始,自己 ...

  9. [RxJS] Filtering operators: distinct and distinctUntilChanged

    Operator distinct() and its variants are an important type of Filtering operator. This lessons shows ...

  10. 一步一步写算法(之 A*算法)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在前面的博客其中,事实上我们已经讨论过寻路的算法.只是,当时的演示样例图中,可选的路径是唯一的 ...