洛谷题目传送门

emm。。。题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧。

就像dynamic ranking那样(蒟蒻的Sol,放一个link骗访问量233)

所有的值(包括初始a数组,操作1、3、4、5的k)全部先丢进去离散化

对于1操作查比它小的数,挑log棵线段树,找区间小于这个数的个数+1,这个还比较好像

操作2就是dynamic ranking,log棵线段树一起加减,像静态主席树求第k小一样跳,操作3 dynamic ranking里也有

操作4先求小于这个数的个数,那么前驱的排名就等于这个个数,注意特判0就好了。

操作5也是先求排名再去找这个数,排名是小于且等于这个数的个数(等于查小于这个数在值域里加+1的数排名)

拼命卡常(小技巧,发现当前跳到的点size已经为0了就不用再往下跳了),然而常数还是丑。。。说不定应该破掉非递归版跑的比递归版多多少少快一点的谣言了?

#include<cstdio>
#include<cstring>
#include<algorithm>
#define RG register
#define R RG int
#define II inline int
#define IV inline void
#define gc if(++pi==iend)fread(pi=ibuf,1,SZ,stdin)
#define pc(C) *po=C;if(++po==oend)fwrite(po=obuf,1,SZ,stdout)
#define Q b+1,b+L+1
#define lb(X) X=lower_bound(Q,X)-b
using namespace std;
const int SZ=1<<20,N=50009,M=5000009,INF=2147483647;//卡了空间,M没到Nlog^2
char ibuf[SZ],obuf[SZ],*pi=ibuf+SZ-1,*po=obuf;
const char*iend=ibuf+SZ,*oend=obuf+SZ;
IV in(R&x){
gc;
while(*pi<'-')gc;
x=*pi&15;gc;
while(*pi>'-'){x*=10;x+=*pi&15;gc;}
}
IV out(R x){
if(x>9)out(x/10);
pc(x%10|'0');
}
int n,L,P,a[N],b[N<<1],op[N],ql[N],qr[N],qk[N];
int rt[N],lc[M],rc[M],s[M],ra[20],rs[20];
IV upd(R p,R k,R v){//更新
for(R u,l,r,m,i=p;i<=n;i+=i&-i){
if(!rt[i])rt[i]=++P;u=rt[i];l=1;r=L;
while(l^r){
s[u]+=v;m=(l+r)>>1;
if(k<=m){r=m;if(!lc[u])lc[u]=++P;u=lc[u];}
else {l=m+1;if(!rc[u])rc[u]=++P;u=rc[u];}
}
s[u]+=v;
}
}
II kth(R p,R k){//求第k小的值
R i,l=1,r=L,m,sum,pa=0,ps=0;
for(i=qr[p] ;i;i-=i&-i)ra[++pa]=rt[i];
for(i=ql[p]-1;i;i-=i&-i)rs[++ps]=rt[i];
while(l^r){
sum=0;m=(l+r)>>1;
for(i=1;i<=pa;++i)sum+=s[lc[ra[i]]];
for(i=1;i<=ps;++i)sum-=s[lc[rs[i]]];
if(k<=sum){
r=m;
for(i=1,p=pa,pa=0;i<=p;++i)ra[++pa]=lc[ra[i]];
for(i=1,p=ps,ps=0;i<=p;++i)rs[++ps]=lc[rs[i]];
}
else{
l=m+1;k-=sum;
for(i=1,p=pa,pa=0;i<=p;++i)ra[++pa]=rc[ra[i]];
for(i=1,p=ps,ps=0;i<=p;++i)rs[++ps]=rc[rs[i]];
}
}
return b[l];
}
II rank(R p,R x){//求离散化后的值的排名(从0计,也就是小于等于值的数的个数)
R i,u,l,r,m,k=0;
for(i=qr[p];i;i-=i&-i){
u=rt[i];l=1;r=L;
while(s[u]&&l^r){
m=(l+r)>>1;
if(x<=m) r=m,u=lc[u];
else k+=s[lc[u]],l=m+1,u=rc[u];
}
}
for(i=ql[p]-1;i;i-=i&-i){
u=rt[i];l=1;r=L;
while(s[u]&&l^r){
m=(l+r)>>1;
if(x<=m) r=m,u=lc[u];
else k-=s[lc[u]],l=m+1,u=rc[u];
}
}
return k;
}
int main(){
R m,i,rk;
in(n);in(m);L=n;
for(i=1;i<=n;++i)in(a[i]);
memcpy(b,a,(n+1)<<2);
for(i=1;i<=m;++i){
in(op[i]);//先存起来
in(ql[i]);if(op[i]!=3)in(qr[i]);
in(qk[i]);if(op[i]!=2)b[++L]=qk[i];
}
b[++L]=INF;sort(Q);L=unique(Q)-b-1;
for(i=1;i<=n;++i)
upd(i,lb(a[i]),1);
for(i=1;i<=m;++i){
if(op[i]!=2)lb(qk[i]);
switch(op[i]){
case 1:out(rank(i,qk[i])+1);pc('\n');break;
case 2:out(kth(i,qk[i]));pc('\n');break;
case 3:upd(ql[i],a[ql[i]],-1);
upd(ql[i],a[ql[i]]=qk[i],1);break;
case 4:rk=rank(i,qk[i]);
if(rk)out(kth(i,rk));
else{pc('-');out(INF);}pc('\n');break;
case 5:rk=rank(i,qk[i]+1);
out(rk>qr[i]-ql[i]?INF:kth(i,rk+1));pc('\n');
}
}
fwrite(obuf,1,po-obuf,stdout);
return 0;
}

洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)的更多相关文章

  1. BZOJ3196 & 洛谷3380:二逼平衡树——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problemnew/show/P3380 (题 ...

  2. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  3. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  4. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

  7. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)

    题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...

  9. 【洛谷4482】Border的四种求法(后缀自动机_线段树合并_链分治)

    这题我写了一天后交了一发就过了我好兴奋啊啊啊啊啊啊 题目 洛谷 4482 分析 这题明明可以在线做的,为什么我见到的所有题解都是离线啊 -- 什么时候有机会出一个在线版本坑人. 题目的要求可以转化为求 ...

  10. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...

随机推荐

  1. 学会如何使用Github进行托管代码和用markdown撰写心得

    这次作业是学会如何使用Github进行托管代码和用markdown撰写心得. 1.掌握使用Git进行代码版本,使用github进行代码托管.(git使用,推荐imooc公开课: 公开课 ) 登录 gi ...

  2. Oracle中Error while performing database login with the XXXdriver; Listener refused the connection with the following error; ORA-12505,TNS:listener does not currently know of SID given inconnect descrip

    一次连接数据库怎么也连接不上,查了多方面资料,终于找到答案,总结 首先应该保证数据库的服务启动 在myeclipse的数据库视图中点 右键->new 弹出database driver的窗口,  ...

  3. 【chrome】"您的连接不是私密连接" 解决办法

    1.启用显示证书选项 在Chrome的地址栏中输入:chrome://flags/#show-cert-link,选择"启用",重启Chrome浏览器.  (操作过无用) 2.安装 ...

  4. cleanCode[1]:有意义的命名

    为什么要有意义的命名: 我们都曾经说过有朝一日再回头清理那些糟糕的代码,然而最终总是弃之不顾.稍后等于永不,我们需要立即行动,写优雅的代码. 写代码的过程中,读占的比例很大,所以首先要让代码易读. 有 ...

  5. 自定义View之实现流行的底部菜单栏中间突起:高仿“咸鱼APP”的底部菜单 - z

    http://blog.csdn.net/xh870189248/article/details/75808341 http://blog.csdn.net/yangg194/article/deta ...

  6. 20155216 Exp3 免杀原理与实践

    Exp3 免杀原理与实践 基于特征码的改变来实现免杀(实践过程记录) MSF编码器编译后门检测 可以通过VirSCAN来检验后门抗杀能力. ps:选择后门前修改其文件名,不得含有数字. 如上图所示,3 ...

  7. 20155218 Exp1 PC平台逆向破解(5)M

    20155218 Exp1 PC平台逆向破解(5)M 1. 掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP指令时,CPU什么 ...

  8. 2017-2018-2 20155315《网络对抗技术》Exp7 :网络欺诈防范

    实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实验内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS sp ...

  9. 隐马尔科夫模型研究 stock 以及 lotto

    说明 本文参考了这里 由于数据是连续的,因此使用了高斯隐马尔科夫模型:gaussianHMM 一.stock代码 import tushare as ts import pandas as pd im ...

  10. 重新解读DDD领域驱动设计(一)

    回顾 十年前,还未踏入某校时,便听闻某学长一毕业就入职北京某公司,月薪过万.对于一个名不见经传的小学院,一毕业能拿到这个薪水还是非常厉害的.听闻他学生期间参与开发了一款股票软件,股票那时正迎来一波疯涨 ...