树状数组套主席树模板题目。

 /* 2112 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
//#define lson l, mid, rt<<1
//#define rson mid+1, r, rt<<1|1 typedef struct {
int l, r, k;
int op;
} ques_t; const int maxq = ;
const int maxn = ;
const int maxm = ;
int n, q, m, tot;
int a[maxn], b[maxn];
int S[maxn], T[maxn];
int lson[maxm], rson[maxm], C[maxm];
ques_t Q[maxq]; void init() {
tot = m = ;
} void Build(int l, int r, int& rt) {
rt = tot++;
C[rt] = ;
if (l == r)
return ; int mid = (l + r) >> ; Build(l, mid, lson[rt]);
Build(mid+, r, rson[rt]);
} int Insert(int rt, int p, int val) {
int nrt = tot++, ret = nrt;
int l = , r = m - , mid; C[nrt] = C[rt] + val;
while (l < r) {
mid = (l + r) >> ;
if (p <= mid) {
lson[nrt] = tot++;
rson[nrt] = rson[rt];
nrt = lson[nrt];
rt = lson[rt];
r = mid;
} else {
lson[nrt] = lson[rt];
rson[nrt] = tot++;
nrt = rson[nrt];
rt = rson[rt];
l = mid + ;
}
C[nrt] = C[rt] + val;
} return ret;
} int lowest(int x) {
return -x & x;
} int use[maxn]; void add(int x, int p, int delta) {
while (x <= n) {
S[x] = Insert(S[x], p, delta);
x += lowest(x);
}
} int sum(int x) {
int ret = ; while (x) {
ret += C[lson[use[x]]];
x -= lowest(x);
} return ret;
} int Query(int L, int R, int k) {
int lrt = T[L-];
int rrt = T[R];
int l = , r = m - , mid;
int tmp; for (int i=L-; i; i-=lowest(i))
use[i] = S[i];
for (int i=R; i; i-=lowest(i))
use[i] = S[i]; while (l < r) {
mid = (l + r) >> ;
tmp = sum(R) - sum(L-) + C[lson[rrt]] - C[lson[lrt]];
if (tmp >= k) {
for (int i=L-; i; i-=lowest(i))
use[i] = lson[use[i]];
for (int i=R; i; i-=lowest(i))
use[i] = lson[use[i]];
r = mid;
lrt = lson[lrt];
rrt = lson[rrt];
} else {
for (int i=L-; i; i-=lowest(i))
use[i] = rson[use[i]];
for (int i=R; i; i-=lowest(i))
use[i] = rson[use[i]];
k -= tmp;
l = mid + ;
lrt = rson[lrt];
rrt = rson[rrt];
}
} return l;
} void solve() {
sort(b, b+m);
m = unique(b, b+m) - b;
Build(, m-, T[]);
rep(i, , n+) {
int id = lower_bound(b, b+m, a[i]) - b;
T[i] = Insert(T[i-], id, );
}
rep(i, , n+)
S[i] = T[]; int ans, lid, rid; rep(i, , q) {
if (Q[i].op) {
lid = lower_bound(b, b+m, a[Q[i].l]) - b;
rid = lower_bound(b, b+m, Q[i].k) - b;
add(Q[i].l, lid, -);
add(Q[i].l, rid, );
a[Q[i].l] = Q[i].k;
} else {
int id = Query(Q[i].l, Q[i].r, Q[i].k);
ans = b[id];
printf("%d\n", ans);
}
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t;
char op[]; scanf("%d", &t);
while (t--) {
scanf("%d %d", &n, &q);
init();
rep(i, , n+) {
scanf("%d", &a[i]);
b[m++] = a[i];
}
rep(i, , q) {
scanf("%s", op);
if (op[] == 'Q') {
Q[i].op = ;
scanf("%d %d %d", &Q[i].l, &Q[i].r, &Q[i].k);
} else {
Q[i].op = ;
scanf("%d %d", &Q[i].l, &Q[i].k);
b[m++] = Q[i].k;
}
} solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

数据发生器。

 from copy import deepcopy
from random import randint, shuffle
import shutil
import string def GenDataIn():
with open("data.in", "w") as fout:
t = 20
bound = 10**4
fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(100, 200)
q = randint(100, 200)
fout.write("%d %d\n" % (n, q))
L = []
for i in xrange(n):
x = randint(1, bound)
L.append(x)
fout.write(" ".join(map(str, L)) + "\n")
for i in xrange(q):
op = randint(0, 1)
if op:
l = randint(1, n)
r = randint(l, n)
k = randint(1, r-l+1)
fout.write("Q %d %d %d\n" % (l, r, k))
else:
l = randint(1, n)
k = randint(1, bound)
fout.write("C %d %d\n" % (l, k)) def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()

【ZOJ】2112 Dynamic Rankings的更多相关文章

  1. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  2. 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)

    [题意] 给定一个含有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 ...

  3. 【BZOJ1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  4. 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组

    题目描述 给定一个含有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≤ ...

  5. 主席树[可持久化线段树](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 ...

  6. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  7. 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)

    SP3946 K-th Number (/2和>>1不一样!!) #include <algorithm> #include <bitset> #include & ...

  8. 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings

    题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...

  9. 【ZOJ】4012 Your Bridge is under Attack

    [ZOJ]4012 Your Bridge is under Attack 平面上随机n个点,然后给出m条直线,问直线上有几个点 \(n,m \leq 10^{5}\) 由于共线的点不会太多,于是我们 ...

随机推荐

  1. Spark小课堂Week3 FirstSparkApp(Dataframe开发)

    Spark小课堂Week3 FirstSparkApp(代码优化) RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lamb ...

  2. 关于yum与源码安装的LAMP或LNMP网页直接显示空白页的问题?

    学习LAMP.LNMP时,遇到很奇怪的问题就是:搭建完LAMP或LNMP环境后安装PHPweb程序时,Discuz和Wordpress打不开安装向导,直接显示空白页(PHPWind9.0除外),没有任 ...

  3. C++数据类型总结

    关键字:C++, 数据类型, VS2015. OS:Windows 10. ANSI C/C++基本数据类型: Type Size 数值范围 无值型void 0 byte 无值域 布尔型bool 1 ...

  4. Java中的异常处理(二)

    1.finally package second; public class C { public static void main(String[] args){ String name = nul ...

  5. .NET安装和配置Oracle数据访问组件(ODAC)

    Many ASP.NET applications access Oracle database for the data source. Oracle supports the .NET with ...

  6. Eclipse中设置作者日期等信息

    在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse 中进行设置自己希望显示的信息. 现在看看如何修改 ...

  7. 【BZOJ 2744 】[HEOI2012]朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  8. K-meams文本聚类算法C++实现

    FROM:http://www.cnblogs.com/finallyliuyu/archive/2010/09/03/1817348.html 头文件: #ifndef _Preprocess_H ...

  9. python学习笔记6(字典)

    映射:键值对的关系,键(key)映射值(value) 字典是Python唯一的映射类型 >>> phonebook = {'} >>> phonebook {'} ...

  10. 对象工具类 - ObjectUtils.java

    对象工具类,提供对象克隆.获取对象属性.类型判断.Map转换对象.对象转Map.设置对象属性等. 源码如下:(点击下载 -  ObjectUtils.java .JsonUtils.java .gso ...