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 ...
随机推荐
- URAL 1081 Binary Lexicographic Sequence
第13个位置第5个Bit :13>num[4] =>1 第四个bit 13-num[4]=5 :5<num[3] =>0 ,3-1 第三个Bit 5>num[2](3) ...
- 空类的默认函数—— SAP电面(2)/FEI
定义一个空类 class Empty { }; 默认会生成以下几个函数 2. 拷贝构造函数 Empty(const Empty& copy) { } 3. 赋值运算符 Empty& o ...
- BZOJ 4305: 数列的GCD( 数论 )
对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...
- Linux 下 Hadoop java api 问题
1. org.apache.hadoop.security.AccessControlException: Permission denied: user=opsuser, access=WRITE, ...
- highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度
highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度 作者:highcharts | 时间:2014-6-11 14:07:05 | [小 大] | ...
- ThinkPHP常量参考
常用常量 APP_NAME 当前项目名称 APP_PATH 当前项目路径 GROUP_NAME 当前分组名称 MODULE_NAME 当前Action模块名称 ACTION_NAME 当前操作的名称 ...
- Python开发环境Spyder安装方法
Spyder(Scientific PYthon Development EnviRonment)是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑.交互测试.调试等特性,支持包括 W ...
- [LeetCode]题解(python):099-Recover Binary Search Tree
题目来源: https://leetcode.com/problems/recover-binary-search-tree/ 题意分析: 二叉搜索树中有两个点错了位置,恢复这棵树. 题目思路: 如果 ...
- Array.Add () and += in PowerShell
$newArray = @() $newArray.Add("Hello") If I create a new array, and using the method Add() ...
- 为什么Lisp没有流行起来
很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面.现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛应用.其他类似的古老的语言有??FORTRAN. COBOL. L ...