来自FallDream的博客,未经允许,请勿转载,谢谢。


维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作:

1 k,将序列a从小到大排序,输出a_k的值。
2 k,将所有严格大于k的数a_i减去k。
n,m<=100000
 
splay维护序列,每次操作小等于k的数字不变,大于2k的数字顺序不变,(k,2k]的数字减小至少一半,最多减小log次,暴力拿出来重新插入就行了。
复杂度nlog^2n
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define Rint register int
#define ll long long
#define MN 100000
#define INF 1000000000000000000LL
#define getchar() (*S++)
char B[<<],*S=B;
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int c[MN+][],fa[MN+],rt=,tag[MN+],n,m,size[MN+],q[MN+],top=;
ll a[MN+];
inline void update(int x){size[x]=size[c[x][]]+size[c[x][]]+;}
inline void Mark(int x,int v){tag[x]+=v;a[x]+=v;}
inline void pushdown(int x){Mark(c[x][],tag[x]);Mark(c[x][],tag[x]);tag[x]=;} void rotate(int x,int&k)
{
int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
if(y==k) k=x; else c[z][c[z][]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
update(y);update(x);
} void Splay(int x,int&k)
{
for(;x!=k;rotate(x,k))
if(fa[x]!=k) rotate((c[fa[fa[x]]][]==fa[x]^c[fa[x]][]==x)?x:fa[x],k);
} void build(int&x,int l,int r,int last)
{
if(l>r) {x=;return;}x=l+r>>;fa[x]=last;
build(c[x][],l,x-,x);
build(c[x][],x+,r,x);
update(x);
} int Ask_After(int x,int v)
{
if(!x) return ;int q;
if(tag[x]) pushdown(x);
if(a[x]>v) return (q=Ask_After(c[x][],v))?q:x;
else return Ask_After(c[x][],v);
} int Ask_Before(int x,int v)
{
if(!x) return ;int q;
if(tag[x]) pushdown(x);
if(a[x]<=v) return (q=Ask_Before(c[x][],v))?q:x;
else return Ask_Before(c[x][],v);
} int Find(int x,int rk)
{
int Sz=size[c[x][]]+;
if(tag[x]) pushdown(x);
if(Sz==rk) return x;
if(Sz<rk) return Find(c[x][],rk-Sz);
else return Find(c[x][],rk);
} void Dfs(int x)
{
if(tag[x]) pushdown(x);
if(c[x][]) Dfs(c[x][]);
q[++top]=x;
if(c[x][]) Dfs(c[x][]);
} void Ins(int&x,int k,int last)
{
if(!x){x=k;c[k][]=c[k][]=;fa[k]=last;size[k]=;return;}
if(tag[x]) pushdown(x);
Ins(c[x][a[k]>=a[x]],k,x);
update(x);
} int main()
{
fread(B,,<<,stdin);
n=read();m=read();
for(Rint i=;i<=n;++i) a[i+]=read();a[]=-INF;a[n+]=INF;
sort(a+,a+n+);build(rt,,n+,);
for(Rint i=;i<=m;++i)
{
int op=read(),v;
if(op==){printf("%d\n",(v=Find(rt,read()+),Splay(v,rt),a[v]));}
if(op==)
{
v=read();int x=Ask_Before(rt,v),y=Ask_After(rt,v<<);
Splay(x,rt);Splay(y,c[rt][]);int z=c[y][];
if(z) {top=;Dfs(z);fa[z]=;c[y][]=;}
update(y);update(x);Mark(y,-v);
if(z) for(Rint j=;j<=top;++j) a[q[j]]-=v,Ins(rt,q[j],),Splay(q[j],rt);
}
}
return ;
}

[bzoj4923]K小值查询的更多相关文章

  1. BZOJ4923 K小值查询(splay)

    容易想到建一棵平衡树,修改时打上标记即可.但是修改会导致平衡树结构被破坏.注意到实际上只有[k+1,2k)这一部分数在平衡树中的位置会被改变,所以对这一部分暴力修改,因为每次都会使其至少减小一半,复杂 ...

  2. [BZ4923][Lydsy1706月赛]K小值查询

    K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...

  3. BZOJ4923:[Lydsy1706月赛]K小值查询(Splay)

    Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...

  4. BZOJ 4923: [Lydsy1706月赛]K小值查询 Splay + 思维

    Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...

  5. BZOJ4923 [Lydsy1706月赛]K小值查询

    题意 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. \(n \leq 10 ...

  6. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...

  7. [BZOJ 4923][Lydsy1706月赛]K小值查询

    传送门 势能分析平衡树,splay或treap都可以 放个指针版的就跑 #include <bits/stdc++.h> using namespace std; #define rep( ...

  8. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  9. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

随机推荐

  1. 《javascript设计模式与开发实践》阅读笔记(12)—— 享元模式

    享元模式 享元(flyweight)模式是一种用于性能优化的模式,"fly"在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 享元模式的核心 ...

  2. Linux安装svn服务图文详解 ;出现No repository found in 'svn***问题

    Linux安装svn服务 ** 示例都是用的root权限,可选择用 sudo** 1:检查 安装条件为:Linux(centos)上未安装过svn服务,若安装过或安装失败请自行删除,这里不多介绍.检查 ...

  3. lamp环境搭建经验总结

    环境:centos6.4,13个源码包:参考教程高罗峰细说php思路:1.首先确定gcc,g++的安装,因为这是c语言的编译工具,没有它,源码不可能安装,redhat的yum需要配置,分为本地源和网络 ...

  4. it's a big trick

    今天,正式的登上了我注册已久的博客园,最初注册园子得出发点是记录生活点滴和学习工作的心得的,那就不忘初心,从头开始吧. 从校园到工作,从东北到南方 我们毕业啦 谁说毕业遥遥无期,转眼就要各奔东西. 是 ...

  5. 网络IO超时的几种实现

    一.select/poll/epoll int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,str ...

  6. django的models模型类的常用数据类型和选项

    django框架的models模块ORM框架,能够让我们通过编写类的方式,帮助我们自动生成数据库表. 生成的数据库表名为 应用模块名称_类名 数据库表中字段名 如果我们没有在参数中指定,就是我们写的类 ...

  7. 用UIWebView加载本地图片和gif图

    加载gif图: NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@" ...

  8. angular中的路径问题

    我们在写项目时会遇到启动页调到引导页,引导页再调到首页, 那我们在用angular框架写这种东西的时候如果我们不细心的话就会遇到问题, 比如说找不到引导页的图片等等. 那我们怎么解决这个问题呢? 首先 ...

  9. jQuery.noConflict() 函数详解

    jQuery.noConflict()函数用于让出jQuery库对变量$(和变量jQuery)的控制权. 一般情况下,在jQuery库中,变量$是变量jQuery的别名,它们之间是等价的,例如jQue ...

  10. java模式之模板模式——抽象类

    模板设计模式(Template ) abstract class Action{ // 定义一个行为类 public static final String WORK = "work&quo ...