【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)

题面

神TM BZOJ权限题

Luogu真良心

题解

如果不考虑修改

很容易的主席树区间第K大

考虑修改

那么修改操作复杂度\(O(nlogn)\)

因此,将区间的和利用树状数组来维护

修改复杂度降为\(O(log^2n)\)

虽然查询的复杂度升为\(O(log^2n)\)

但是整体复杂度变为\(O(mlog^2n)\)

于是就愉快的AC了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 20005
#define lson t[now].ls
#define rson t[now].rs
#define mid ((l+r)>>1)
#define Q q
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
int v;
int ls,rs;
}t[MAX<<9];
int tot;
int S[MAX],sum,a[MAX],n,m;
int rt[MAX],cnt0,cnt1;
int tmp[3][MAX];
struct OPT
{
bool opt;
int l,r,k;
int pos,t;
}Q[MAX];
inline int lowbit(int x){return x&(-x);}
void Modify(int &now,int l,int r,int pos,int val)
{
if(!now)now=++tot;
t[now].v+=val;
if(l==r)return;
if(pos<=mid)Modify(lson,l,mid,pos,val);
else Modify(rson,mid+1,r,pos,val);
}
void PreModify(int x,int val)
{
int k=lower_bound(&S[1],&S[sum+1],a[x])-S;
while(x<=n)
{
Modify(rt[x],1,sum,k,val);
x+=lowbit(x);
}
}
int Query(int l,int r,int k)
{
if(l==r)return l;
int s=0;
for(int i=1;i<=cnt1;++i)s+=t[t[tmp[1][i]].ls].v;
for(int i=1;i<=cnt0;++i)s-=t[t[tmp[0][i]].ls].v;
if(k<=s)
{
for(int i=1;i<=cnt1;++i)tmp[1][i]=t[tmp[1][i]].ls;
for(int i=1;i<=cnt0;++i)tmp[0][i]=t[tmp[0][i]].ls;
return Query(l,mid,k);
}
else
{
for(int i=1;i<=cnt1;++i)tmp[1][i]=t[tmp[1][i]].rs;
for(int i=1;i<=cnt0;++i)tmp[0][i]=t[tmp[0][i]].rs;
return Query(mid+1,r,k-s);
}
}
int PreQuery(int l,int r,int k)
{
cnt0=cnt1=0;l--;
while(r)tmp[1][++cnt1]=rt[r],r-=lowbit(r);
while(l)tmp[0][++cnt0]=rt[l],l-=lowbit(l);
return Query(1,sum,k);
}
char opt[3];
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)S[++sum]=a[i]=read();
for(int i=1;i<=m;++i)
{
scanf("%s",opt);
q[i].opt=opt[0]=='Q';
if(q[i].opt)q[i].l=read(),q[i].r=read(),q[i].k=read();
else q[i].pos=read(),q[i].t=S[++sum]=read();
}
sort(&S[1],&S[sum+1]);
sum=unique(&S[1],&S[sum+1])-S-1;
for(int i=1;i<=n;++i)PreModify(i,1);
for(int i=1;i<=m;++i)
{
if(q[i].opt)
{
printf("%d\n",S[PreQuery(Q[i].l,Q[i].r,Q[i].k)]);
}
else
{
PreModify(Q[i].pos,-1);
a[Q[i].pos]=Q[i].t;
PreModify(Q[i].pos,1);
}
}
return 0;
}

【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)的更多相关文章

  1. [BZOJ1901][luogu2617]Dynamic Rankings(树状数组+主席树)

    题面 单点修改,区间求第k大 分析 首先,这道题卡权值线段树套treap的做法,所以只能用主席树做 对于静态的查询,root[i]对应的主席树的区间[l,r]保存的是a[1]~a[i]有多少个值落在区 ...

  2. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  3. 【bzoj1901】dynamic ranking(带修改主席树/树套树)

    题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...

  4. 【bzoj1901】dynamic ranking(带修改主席树)

    传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...

  5. [bzoj1901][Zju2112]Dynamic Rankings_主席树

    Dynamic Rankings bzoj-1901 Zju-2112 题目大意:给定一个n个数的序列,m个操作,支持:单点修改:查询区间k小值. 注释:$1\le n,m\le 10^4$. 想法: ...

  6. BZOJ1901 Zju2112 Dynamic Rankings 主席树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...

  7. BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9094  Solved: 3808[Submit][Status][Discuss] Descript ...

  8. [Luogu2617]Dynamic Ranking

    题面戳这 类似算法总结 1.静态整体Kth 滑稽吧...sort一遍就好了. 时间复杂度\(O(nlogn)\) 空间复杂度\(O(n)\) 2.动态整体Kth 离散化后开一棵权值线段树,每个位置的值 ...

  9. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...

  10. BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...

随机推荐

  1. 开启MySQL远程访问权限 允许远程连接

    1.登陆mysql数据库 mysql -u root -p 查看user表 mysql> use mysql;Database changedmysql> select host,user ...

  2. vue 路由懒加载 使用,优化对比

    vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运 ...

  3. React设计思想

    熟悉一个新技术的关键是熟悉他的特色和理念 React框架本身和我们常用的JavaScript MVC框架,如:AngularJS,Backbone,Ember等,没有直接的可比性.在React的官方博 ...

  4. llinux基本指令

    1.关机重启1)关机shutdown -h now (立刻关机)shutdown -h 5 (5分钟后关机)2)重启shutdown -r now (立刻重启)shutdown -r 5 (5分钟后重 ...

  5. 跟面向对象卯上了,看看ES6的“类”

    上回我们说到ES5的面向对象,以及被大家公认的最佳的寄生组合式继承.时代在进步,在ES6中对于面向对象这个大boss理所应当地进行了一次大改,从原先那种比较长的写法转变为"小清新" ...

  6. NDK 开发中,各种指令集的坑,arm64

          最近在NDK开发中遇到了一个奇怪的问题,希望记录下,可以帮到大家:         我编译了一些 .so 动态库,只编译了armeabi-v7a.armeabi 指令集,其它指令集编译不了 ...

  7. 怎么添加用户到sudo用户组

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 前段时间用Ubuntu的sudo用惯了,回到kali发现自己的用户太low了, ...

  8. WinForm中ClickOnce发布至广域网

    ClickOnce智能客户端,是微软提供比较早的一项技术,用于实现WinForm开发的应用程序能够自动更新,省去给每台客户端升级带来的困扰. 从网上的贴子里看,有的说好用,有的说不好用.客观的说,微软 ...

  9. 【学习笔记】Hibernate 注解 (Y2-1-9)

    Hibernate注解 1.什么是注解在类上或者方法上打上其他类型的类型元数据 @标志 使用过的注解: @override  方法重写 @Test Junit 单元测试 @Before 单元测试 @A ...

  10. Eclipse中如何忽略报错的js文件

    https://jingyan.baidu.com/article/4f7d5712d3701a1a20192786.html