【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}\) 由于共线的点不会太多,于是我们 ...
随机推荐
- jQuery 全选 反选 单击行改变背景色
我先把CSS样式放出来,其实这个可以直接忽略 ;;font-size:12px;font-family:微软雅黑;} .datagrid{width:100%;} .datagird tr th{ba ...
- C#源码大汇总
C#高仿QQ2013可在广域网部署聊天系统GG叽叽 动态显示硬盘分区容量饼图 自定义ProgressBar控件高仿Win8进度条 多皮肤精美在线QQ悬浮客服插件 jQuery仿天猫首页多格焦点图片轮播 ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...
- ajax分页效果实现
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Jquery ajax basic
$.ajax({ url: "test.aspx?action=testaction", contentType: "application/json; charset= ...
- 如何使用Git——(二)
8.首次安装git,然后要把创建好的仓库放到github上,首先,你要先做一些基本设置,继续设置吧~~. 在git黑框框中输入 ssh-keygen -t rsa -C "your ema ...
- Beaglebone Back学习五(PWM测试)
PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 ...
- 关于location
---恢复内容开始--- window.location跳转+替换+刷新 一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pag ...
- Eclipse 中隐藏的 5 个非常有用的功能
Eclipse就是一头野兽.它也是一套设备,神秘但更具威力.有些人称它为一个持续变形机.另一些人则称它是一个变异体.不错,它很庞大,需要花费多年才能掌握.而在你好不容易掌握之后,你的老板出现了然后告诉 ...
- Google面试题
今天早上在Quora上看到的一个题目,很不错的!最直观的是枚举n^3,但稍微进步一点的观察是找出3个数,然后最大的减去最小的2倍的结果,然后就有了线性扫一遍就OK. Given three array ...