裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树小). 时空复杂度是O(Nlog(N)+Mlog^2(N))

-------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
 
using namespace std;
 
#define H(v) (lower_bound(Hash, Hash + Hn, v) - Hash + 1)
 
const int maxn = 10009;
 
int N, Q;
int seq[maxn];
int Hash[maxn << 1], Hn;
int Val, Pos;
 
inline int read() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ret = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
 
struct Event {
int l, r, v;
Event(int _l = 0, int _r = 0, int _v = 0) :
l(_l), r(_r), v(_v) {
}
} q[maxn];
 
void Init() {
Hn = 0;
N = read(), Q = read();
for(int i = 1; i <= N; i++)
Hash[Hn++] = (seq[i] = read());
for(int i = 0; i < Q; i++) {
char c = getchar();
for(; c != 'C' && c != 'Q'; c = getchar());
if(c == 'C') {
int p = read(), v = read();
q[i] = Event(-1, p, v);
Hash[Hn++] = v;
} else {
int l = read() - 1, r = read();
q[i] = Event(l, r, read());
}
}
sort(Hash, Hash + Hn);
Hn = unique(Hash, Hash + Hn) - Hash;
}
 
struct Node {
Node *lc, *rc;
int v;
} pool[5000000], *pt, *Null, *Root[maxn], *V[maxn];
 
void Init_sgt() {
pt = pool;
Null = pt++;
Null->v = 0;
Null->lc = Null->rc = Null;
}
 
Node* Modify(Node* t, int l, int r) {
Node* o = pt++;
o->v = t->v + Val;
if(l != r) {
int m = (l + r) >> 1;
if(Pos <= m) {
o->lc = Modify(t->lc, l, m);
o->rc = t->rc;
} else {
o->lc = t->lc;
o->rc = Modify(t->rc, m + 1, r);
}
}
return o;
}
 
void Build() {
Root[0] = Null;
Val = 1;
for(int i = 1; i <= N; i++) {
Pos = seq[i] = H(seq[i]);
Root[i] = Modify(Root[i - 1], 1, Hn);
}
}
 
Node *L[20], *R[20];
int Ln, Rn;
 
void Work() {
for(int i = 1; i <= Hn; i++)
V[i] = Null;
for(int i = 0; i < Q; i++)
if(~q[i].l) {
Ln = Rn = 0;
for(int p = q[i].l; p; p -= p & -p)
L[Ln++] = V[p];
for(int p = q[i].r; p; p -= p & -p)
R[Rn++] = V[p];
Node *_L = Root[q[i].l], *_R = Root[q[i].r];
int l = 1, r = Hn;
while(l < r) {
int cnt = _R->lc->v - _L->lc->v, m = (l + r) >> 1;
for(int j = 0; j < Ln; j++)
cnt -= L[j]->lc->v;
for(int j = 0; j < Rn; j++)
cnt += R[j]->lc->v;
if(cnt >= q[i].v) {
_L = _L->lc;
_R = _R->lc;
for(int j = 0; j < Ln; j++)
L[j] = L[j]->lc;
for(int j = 0; j < Rn; j++)
R[j] = R[j]->lc;
r = m;
} else {
q[i].v -= cnt;
_L = _L->rc;
_R = _R->rc;
for(int j = 0; j < Ln; j++)
L[j] = L[j]->rc;
for(int j = 0; j < Rn; j++)
R[j] = R[j]->rc;
l = m + 1;
}
}
printf("%d\n", Hash[l - 1]);
} else {
Pos = seq[q[i].r], Val = -1;
for(int p = q[i].r; p <= Hn; p += p & -p)
V[p] = Modify(V[p], 1, Hn);
Pos = seq[q[i].r] = H(q[i].v), Val = 1;
for(int p = q[i].r; p <= Hn; p += p & -p)
V[p] = Modify(V[p], 1, Hn);
}
}
 
int main() {
Init();
Init_sgt();
Build();
Work();
return 0;
}

------------------------------------------------------------------------

1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 5988  Solved: 2489
[Submit][Status][Discuss]

Description

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。 第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

Input

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Output

Sample Input

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

Sample Output

3
6

HINT

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )的更多相关文章

  1. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

  2. P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  3. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  4. LUOGU P2617 Dynamic Rankings(树状数组套主席树)

    传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...

  5. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  6. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  7. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  8. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  9. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

  10. Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)

    E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...

随机推荐

  1. php将文件夹打包成zip文件

    function addFileToZip($path,$zip){    $handler=opendir($path); //打开当前文件夹由$path指定.    while(($filenam ...

  2. C# DataTable转实体 通用方法【转】

    public static T GetEntity<T>(DataTable table) where T : new()    {        T entity = new T();  ...

  3. 使用c#获取access中所有表的表名与内容

    以前在网上查过,似乎也可以通过读取access系统表的方法来获得,但是实在想不想来是什么,今天又在网上找了找,终于发现更加方便的方法,更重要的是,这种方法也可以通用所有OLEDB数据源. 这里用到了O ...

  4. ER图与UML图

    ER图:实体-联系图(Entity-Relation Diagram)用来建立数据模型,在数据库系统概论中属于概念设计阶段,ER图提供了表示实体(即数据对象).属性和联系的方法,用来描述现实世界的概念 ...

  5. ios 中的构造方法(二)

    在之前有简单介绍了构造方法的结构,以及构造方法的作用,那么我们现在来讨论一下: 对象的创建分为两步:+ alloc 分配内存空间和 -init 进行初始化 那么在继承自 NSObject 的类当中,我 ...

  6. FAQ:win7和win8 64位注册ocx控件方法

    win7/win8 问题所在: 64位的系统一般都是可以安装32位程序的, 执行         C:\Windows\SysWOW64\regsvr32.exe 而不是 C:\Windows\Sys ...

  7. 异常 ORA-00257: archiver error. Connect internal only, until freed

    我oracle 是安装在linux 下. ORA-00257: archiver error. Connect internal only, until freed 得知是错误是由于归档日志(arch ...

  8. 怎样在超级终端和PC之间通过串口传输文件

    Windows环境下,通过SecureCRT软件,用串口向ARM开发板发送文件: 输入命令 rz,可以看到如下图所示: 选择路径点击上传即可. 如果是想从Arm开发板中把文件Down下来,则可以按照下 ...

  9. mysql 索引创建规则

    1.表的主键.外键必须有索引:2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: 5 ...

  10. (转载)JS中的prototype

    原文地址:http://www.cnblogs.com/yjf512/archive/2011/06/03/2071914.html#!comments JS中的phototype是JS中比较难理解的 ...