【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. linux内核链表的使用

    linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...

  2. PHPUnit-附录 C. XML 配置文件

    [http://www.phpunit.cn/manual/5.7/zh_cn/appendixes.configuration.html] PHPUnit <phpunit> 元素的属性 ...

  3. C# 托管堆和垃圾回收器GC

    这里我们讨论的两个东西:托管堆和垃圾回收器,前者是负责创建对象并控制这些对象的生存周期,后者负责回收这些对象. 一.托管堆分配资源 CLR要求所有的对象都从托管堆分配.进程初始化时,CLR划出一个地址 ...

  4. Angular4.0用命令行创建组件服务出错

    之前使用cnpm创建的angular4.0项目,由于cnpm下载的node_modules资源经常会有部分缺失,所以在用命令行创建模板.服务的时候会报错: Error: ELOOP: too many ...

  5. vue——安装并新建项目

    一.对于vue的安装: 1.安装vue之前先安装node,https://nodejs.org/zh-cn/download/,我装的是windows64位的: 2.下载好了之后就可以按照正常顺序安装 ...

  6. php程序员的成长之路

    第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护:能够做基本的简单系统的php开发:能够在PHP中型系统中支 ...

  7. Linux中select poll和epoll的区别

    在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select.poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加 ...

  8. Object方法

    1. getClass() 返回此 Object 的运行时类. 2. hashCode() 返回该对象的哈希码值. 3. equals() 指示其他某个对象是否与此对象“相等”. 4. toStrin ...

  9. RMAN还原时注意set newname时文件名不要有空格

      今天遇到一个非常奇怪的现象,查看ORACLE数据库的一个文件,明明这个文件是存在的,但是使用ls -lrt 查看都显示这个文件不存在.很是纳闷! 后面发现在终端输入文件名后并使用tab键时,发现文 ...

  10. 了解c3p0,dbcp与druid

    说到druid,这个是在开源中国开源项目中看到的,说是比较好的数据连接池.于是乎就看看.扯淡就到这. 下面就讲讲用的比较多的数据库连接池.(其实我最先接触的是dbcp这个) 1)DBCP DBCP是一 ...