【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. JMETER_16个逻辑控制器详解

    Jmeter逻辑控制器(Logic Controller)介绍: 1. Jmeter官网对逻辑控制器的解释是:"Logic Controllers determine the order i ...

  2. 在Linux/Centos下用wondershaper限速

    wondershaper是国外人开发的一款在Linux内核下基于TC工具的对整块网卡的限度工具,虽然有很久没有更新了,但是测试老版本在Centos6.3上依然可以使用. 首先下载wondershape ...

  3. Redis 实践2-数据结构

    alias redis-cli='/usr/local/redis/bin/redis-cli'   vi .bashrc 编辑加入  alias redis-cli='/usr/local/redi ...

  4. 通过读取配置文件,启动mongodb

    在实际的项目中,经常利用mongodb数据库做缓存,mongodb的并发性比较高,所以对于快速存储.读取信息有很多优点.在项目中对于第一次的数据请求会直接访问数据库,而对于获得的信息通常都会在此时刻存 ...

  5. 广告等第三方应用嵌入到web页面方案 之 使用js片段

    在自己的项目中嵌入过广告的朋友们可能都用过百度联盟, 只需要嵌入如下一段js代码片段, 就可以在自己的项目中嵌入广告, 来获得收益. <script type="text javasc ...

  6. mvc get image 500

    mvc中get图片时报500错误 很奇怪,突然变500错误了,一番查找之后发现原来是因为mimeType重复定义的原因,吐血.. http://stackoverflow.com/questions/ ...

  7. springBoot之配置文件的读取以及过滤器和拦截器的使用

    前言 在之前的学习springBoot中,成功的实现了Restful风格的基本服务.但是想将之前的工程作为一个项目来说,那些是仅仅不够的.可能还需要获取自定义的配置以及添加过滤器和拦截器.至于为什么将 ...

  8. canvas-缩放

    Canvas-图片缩放 由上一篇canvas-旋转的例子可以了解到canvas的一些特性,不熟悉的同学可以先去看看canvas-旋转. 我们在将图片引入canvas时,图片会一原始像素渲染.这样往往不 ...

  9. JAVA浮点数计算精度损失底层原理与解决方案

    浮点数会有精度损失这个在上大学的时候就已经被告知,但是至今完全没有想明白其中的原由,老师讲的时候也是一笔带过的,自己也没有好好琢磨.终于在工作的时候碰到了,于是google了一番. 问题: 对两个do ...

  10. zoj 3962 Seven Segment Display 数位dp

    非常好的一个题,可以比赛时想到的状态太奇葩,不方便转移,就一直没能AC. 思路:dp(i, j)表示已经考虑了前i位,前i位的和为j的贡献.如果当前的选择一直是最大的选择,那么就必须从0~下一位的最大 ...