BZOJ 3196
program bzoj3196;
const inf=;
maxn=;
maxm=; var n,m,time,temp:longint;
root,a:array [..maxn] of longint;
left,right,rnd,v,s,w:array [..maxm] of longint; procedure update(now:longint);
begin
s[now]:=s[left[now]]+s[right[now]]+w[now];
end; procedure rightturn(var now:longint);
var t:longint;
begin
t:=left[now];
left[now]:=right[t];
right[t]:=now;
s[t]:=s[now];
update(now);
now:=t;
end; procedure leftturn(var now:longint);
var t:longint;
begin
t:=right[now];
right[now]:=left[t];
left[t]:=now;
s[t]:=s[now];
update(now);
now:=t;
end; procedure insert(var now:longint; num:longint);
begin
if now= then
begin
inc(time);
now:=time;
w[now]:=;
s[now]:=w[now];
v[now]:=num;
rnd[now]:=random(inf);
exit;
end;
inc(s[now]);
if num=v[now] then inc(w[now])
else if num<v[now] then
begin
insert(left[now],num);
if rnd[left[now]]<rnd[now] then rightturn(now);
end
else
begin
insert(right[now],num);
if rnd[right[now]]<rnd[now] then leftturn(now);
end;
end; procedure del(var now:longint; num:longint);
begin
if v[now]=num then
begin
if w[now]> then
begin
dec(w[now]);
dec(s[now]);
exit;
end;
if left[now]*right[now]= then
now:=left[now]+right[now]
else
if rnd[left[now]]<rnd[right[now]] then
begin
rightturn(now);
del(now,num);
end
else
begin
leftturn(now);
del(now,num);
end
end
else
if num<v[now] then
begin
del(left[now],num);
dec(s[now]);
end
else
begin
del(right[now],num);
dec(s[now]);
end;
end; procedure build(now,l,r,x,num:longint);
var mid:longint;
begin
insert(root[now],num);
if l=r then exit;
mid:=(l+r) shr ;
if x<=mid then build(now<<,l,mid,x,num)
else build(now<< or ,mid+,r,x,num);
end; procedure ask_rank(now,num:longint);
begin
if now= then exit;
if num=v[now] then
begin
inc(temp,s[left[now]]);
exit;
end
else
if num<v[now] then
ask_rank(left[now],num)
else
begin
inc(temp,s[left[now]]+w[now]);
ask_rank(right[now],num);
end;
end; procedure get_rank(now,l,r,x,y,num:longint);
var mid:longint;
begin
mid:=(l+r) shr ;
if (l=x) and (r=y) then
begin
ask_rank(root[now],num);
exit;
end;
if mid>=y then get_rank(now<<,l,mid,x,y,num)
else if mid<x then get_rank(now<< or ,mid+,r,x,y,num)
else
begin
get_rank(now<<,l,mid,x,mid,num);
get_rank(now<< or ,mid+,r,mid+,y,num);
end;
end; procedure get_index(x,y,z:longint);
var l,r,ans,mid:longint;
begin
l:=; r:=inf;
while l<=r do
begin
mid:=(l+r) shr ;
temp:=;
get_rank(,,n,x,y,mid);
if temp<=z then
begin
l:=mid+;
ans:=mid;
end
else
r:=mid-;
end;
writeln(ans);
end; procedure change(now,l,r,x,num,y:longint);
var mid:longint;
begin
del(root[now],y);
insert(root[now],num);
if l=r then exit;
mid:=(l+r) shr ;
if x<=mid then change(now<<,l,mid,x,num,y)
else change(now<< or ,mid+,r,x,num,y);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end; function min(x,y:longint):longint;
begin
if x<y then exit(x)
else exit(y);
end; procedure before(now,num:longint);
begin
if now= then exit;
if v[now]<num then
begin
temp:=max(v[now],temp);
before(right[now],num);
end
else
before(left[now],num);
end; procedure after(now,num:longint);
begin
if now= then exit;
if v[now]>num then
begin
temp:=min(v[now],temp);
after(left[now],num);
end
else
after(right[now],num);
end; procedure ask_after(now,l,r,x,y,num:longint);
var mid:longint;
begin
if (l=x) and (r=y) then
begin
after(root[now],num);
exit;
end;
mid:=(l+r) shr ;
if mid>=y then ask_after(now<<,l,mid,x,y,num)
else if mid<x then ask_after(now<< or ,mid+,r,x,y,num)
else
begin
ask_after(now<<,l,mid,x,mid,num);
ask_after(now<< or ,mid+,r,mid+,y,num);
end;
end; procedure ask_before(now,l,r,x,y,num:longint);
var mid:longint;
begin
if (l=x) and (r=y) then
begin
before(root[now],num);
exit;
end;
mid:=(l+r) shr ;
if mid>=y then ask_before(now<<,l,mid,x,y,num)
else if mid<x then ask_before(now<< or ,mid+,r,x,y,num)
else
begin
ask_before(now<<,l,mid,x,mid,num);
ask_before(now<< or ,mid+,r,mid+,y,num);
end;
end; procedure main;
var i,x,y,now,f:longint;
begin
read(n,m);
for i:= to n do read(a[i]);
for i:= to n do build(,,n,i,a[i]);
for i:= to m do
begin
read(f);
case f of
:
begin
read(x,y,now);
temp:=;
get_rank(,,n,x,y,now);
writeln(temp);
end;
:
begin
read(x,y,now);
get_index(x,y,now);
end;
:
begin
read(x,y);
change(,,n,x,y,a[x]);
a[x]:=y;
end;
:
begin
read(x,y,now);
temp:=;
ask_before(,,n,x,y,now);
writeln(temp);
end;
:
begin
read(x,y,now);
temp:=inf;
ask_after(,,n,x,y,now);
writeln(temp);
end;
end;
end;
end; begin
main;
end.
BZOJ 3196的更多相关文章
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- BZOJ 3196 二逼平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的 ...
- BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
- bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- 【42.38%】【BZOJ 3196】二逼平衡树
Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1363 Solved: 579 [Submit][Status][Discuss] Descripti ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- bzoj 3196: Tyvj 1730 二逼平衡树
#include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...
随机推荐
- SMACSS:一个关于CSS的最佳实践-3.Layout Rules
本篇笔者要介绍的是Layout Rules.看完本篇,大家将会知道Layout Rules的作用,以及哪些CSS应该归类为Layout Rules. 什么是Layout Rules? Layout R ...
- UVa10082 WERTYU
#include <stdio.h>#include <string.h> int main(){ // 用C++提交AC char s[] = "`12345 ...
- [Swust OJ 838]--最优价值(0-1背包+数学)
题目链接:http://acm.swust.edu.cn/problem/838/ Time limit(ms): 1000 Memory limit(kb): 10000 Description 我 ...
- jbpmAPI-6
第六章流程. 6.1. What is BPMN 2.0 业务流程模型和符号(BPMN)2.0规范是OMG规范,不仅定义了一个标准的业务流程的图形化表述(如BPMN 1. x),但现在还包括执行语义定 ...
- 一周学会Mootools 1.4中文教程:(2)函数
温故: 透过对上一节课的学习,相信大家对mt的选择器应该有了一定的认识了,我再放几个小示例让大家对选择器的复杂应用有所了解: <!DOCTYPE html PUBLIC "-//W3C ...
- Grunt.js 上手
Official Site gruntjs.org/docs/getting-started.html 或者看http://tgideas.qq.com/webplat/info/news_versi ...
- discuz默认模板文件结构详解-模板文件夹介绍
| — template — default 系统内置风格模板(默认风格)| — template — default – discuz_style_default.xml 风格安装文件,可用 ...
- Storm几篇文章
http://tianhailong.com/ http://www.cnblogs.com/panfeng412/archive/2012/07/02/storm-common-patterns-o ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- linux下c/c++方式访问curl的帮助手册
自:http://blog.chinaunix.net/u1/47395/showart_1768832.html 有个业务需求需要通过curl 代理的方式来访问外网 百度了一把,测试可以正常使用.记 ...