【ZOJ】2112 Dynamic Rankings
树状数组套主席树模板题目。
/* 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的更多相关文章
- 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
[BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...
- 【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 ...
- 【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小的数是 ...
- 【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≤ ...
- 主席树[可持久化线段树](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 ...
- ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)
题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...
- 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)
SP3946 K-th Number (/2和>>1不一样!!) #include <algorithm> #include <bitset> #include & ...
- 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings
题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...
- 【ZOJ】4012 Your Bridge is under Attack
[ZOJ]4012 Your Bridge is under Attack 平面上随机n个点,然后给出m条直线,问直线上有几个点 \(n,m \leq 10^{5}\) 由于共线的点不会太多,于是我们 ...
随机推荐
- Spark小课堂Week3 FirstSparkApp(Dataframe开发)
Spark小课堂Week3 FirstSparkApp(代码优化) RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lamb ...
- 关于yum与源码安装的LAMP或LNMP网页直接显示空白页的问题?
学习LAMP.LNMP时,遇到很奇怪的问题就是:搭建完LAMP或LNMP环境后安装PHPweb程序时,Discuz和Wordpress打不开安装向导,直接显示空白页(PHPWind9.0除外),没有任 ...
- C++数据类型总结
关键字:C++, 数据类型, VS2015. OS:Windows 10. ANSI C/C++基本数据类型: Type Size 数值范围 无值型void 0 byte 无值域 布尔型bool 1 ...
- Java中的异常处理(二)
1.finally package second; public class C { public static void main(String[] args){ String name = nul ...
- .NET安装和配置Oracle数据访问组件(ODAC)
Many ASP.NET applications access Oracle database for the data source. Oracle supports the .NET with ...
- Eclipse中设置作者日期等信息
在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse 中进行设置自己希望显示的信息. 现在看看如何修改 ...
- 【BZOJ 2744 】[HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- K-meams文本聚类算法C++实现
FROM:http://www.cnblogs.com/finallyliuyu/archive/2010/09/03/1817348.html 头文件: #ifndef _Preprocess_H ...
- python学习笔记6(字典)
映射:键值对的关系,键(key)映射值(value) 字典是Python唯一的映射类型 >>> phonebook = {'} >>> phonebook {'} ...
- 对象工具类 - ObjectUtils.java
对象工具类,提供对象克隆.获取对象属性.类型判断.Map转换对象.对象转Map.设置对象属性等. 源码如下:(点击下载 - ObjectUtils.java .JsonUtils.java .gso ...