题目链接:戳我

其实我并不会做,于是看了题解

我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构。不过一般的主席树只能搞定静态区间第K大。如果带修怎么办呢?

想一下。。。单点修改+区间查询,我们是否能想到树状数组呢?

那么思路就出来了。用树状数组来维护主席树的前缀和!!这里的主席树只需要维护对于每个节点所包含的值域区间中数的个数即可,不需要继承历史版本。

单次操作复杂度两个log,应该是稳稳的了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100010
using namespace std;
inline int read()
{
int f=1,x=0; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}
return x*f;
}
int n,m,q_cnt,cnt,tot,cnt1,cnt2;
int a[MAXN],S[MAXN],rt[MAXN],tmp1[MAXN],tmp2[MAXN];
struct Node{int l,r,k,pos,t;}q[MAXN];
struct Node2{int ls,rs,v;}t[MAXN<<5];
inline void modify(int &now,int l,int r,int pos,int k)
{
if(!now) now=++tot;
t[now].v+=k;
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) modify(t[now].ls,l,mid,pos,k);
else modify(t[now].rs,mid+1,r,pos,k);
}
inline void pre_modify(int x,int k)
{
int pos=lower_bound(&S[1],&S[1+cnt],a[x])-S;
for(int i=x;i<=n;i+=i&(-i))
modify(rt[i],1,cnt,pos,k);
}
inline int query(int l,int r,int k)
{
if(l==r) {return S[l];}
int cur_ans=0;
for(int i=1;i<=cnt1;i++) cur_ans+=t[t[tmp1[i]].ls].v;
for(int i=1;i<=cnt2;i++) cur_ans-=t[t[tmp2[i]].ls].v;
int mid=(l+r)>>1;
if(cur_ans>=k)
{
for(int i=1;i<=cnt1;i++) tmp1[i]=t[tmp1[i]].ls;
for(int i=1;i<=cnt2;i++) tmp2[i]=t[tmp2[i]].ls;
return query(l,mid,k);
}
else
{
for(int i=1;i<=cnt1;i++) tmp1[i]=t[tmp1[i]].rs;
for(int i=1;i<=cnt2;i++) tmp2[i]=t[tmp2[i]].rs;
return query(mid+1,r,k-cur_ans);
}
}
inline void pre_query(int l,int r,int k)
{
cnt1=cnt2=0;
for(int i=r;i;i-=i&(-i)) tmp1[++cnt1]=rt[i];
for(int i=l;i;i-=i&(-i)) tmp2[++cnt2]=rt[i];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) a[i]=read(),S[++cnt]=a[i];
for(int i=1;i<=m;i++)
{
char cur[10];
scanf("%s",cur);
if(cur[0]=='Q') q[i]=(Node){read()-1,read(),read(),0,0};
else q[i]=(Node){0,0,0,read(),read()},S[++cnt]=q[i].t;
}
sort(&S[1],&S[cnt+1]);
cnt=unique(&S[1],&S[cnt+1])-S-1;
for(int i=1;i<=n;i++) pre_modify(i,1);
for(int i=1;i<=m;i++)
{
if(q[i].k!=0)
{
pre_query(q[i].l,q[i].r,q[i].k);
printf("%d\n",query(1,cnt,q[i].k));
}
else
{
pre_modify(q[i].pos,-1);
a[q[i].pos]=q[i].t;
pre_modify(q[i].pos,1);
}
}
}

BZOJ1901 Dynamic Rankings|带修主席树的更多相关文章

  1. 【BZOJ-1901】Dynamic Rankings 带修主席树

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7292  Solved: 3038[Su ...

  2. [luogu P2617] Dynamic Rankings 带修主席树

    带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...

  3. BZOJ 1901: Zju2112 Dynamic Rankings | 带修改主席树

    题目: emmmm是个权限题 题解: 带修改主席树的板子题,核心思想是用树状数组维护动态前缀和的性质来支持修改 修改的时候修改类似树状数组一样进行logn个Insert 查询的时候同理,树状数组的方法 ...

  4. P2617 Dynamic Rankings(带修主席树)

    所谓带修主席树,就是用树状数组的方法维护主席树的前缀和 思路 带修主席树的板子 注意数据范围显然要离散化即可 代码 #include <cstdio> #include <cstri ...

  5. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  6. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  7. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

    3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...

  8. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  9. 带修主席树 洛谷2617 支持单点更新以及区间kth大查询

    题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...

随机推荐

  1. Scala操作MongoDB

    Scala操作MongoDB // Maven <dependencies> <dependency> <groupId>org.mongodb</group ...

  2. java算法 第七届 蓝桥杯B组(题+答案) 9.取球博弈

    9.取球博弈  (程序设计) 两个人玩取球的游戏.一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目.如果无法继续取球,则游戏结束.此时,持有奇数个球的一方获胜.如果两人都是 ...

  3. Solo and Mute

    [Solo and Mute ] Muting means a transition will be disabled. Soloed transtions are enabled and with ...

  4. Uniform & Attribute & Varying

    [Uniform & Attribute & Varying] 顶点着色器的输入变量用关键字“attribute”来限定. 片段着色器的输入变量(它和顶点着色器的输出变量相对应)用关键 ...

  5. Ubuntu14.04下opencv卸载与重装

    参考链接:http://askubuntu.com/questions/334158/installing-opencv http://stackoverflow.com/questions/1313 ...

  6. ApexSql Log 数据库操作的后悔药

    ApexSQL Log破解版是一款功能强大的SQL数据恢复工具,支持SQL2005/2008/2012.很多时候我们存放在服务器中的SQL数据库会因黑客破坏或误操作造成数据库文件丢失的你问题,当数据库 ...

  7. Mysql蠕虫复制

    将查询出来的数据插入到指定表中,形如: INSERT into user_info(version,create_user_count,create_pc_count) select version, ...

  8. Python设计模式之"外观模式"实例讲解

    Python中设计模式之外观模式主张以分多模块进行代码管理而减少耦合,下面用实例来进行说明. 应用特性: 在很多复杂而小功能需要调用需求时,而且这些调用往往还有一定相关性,即一调用就是一系列的. 结构 ...

  9. [SoapUI] 在某个测试步骤下面增加Script Assertion,运用 messageExchange 获取response content

    import com.eviware.soapui.support.GroovyUtils import com.eviware.soapui.support.XmlHolder import org ...

  10. ProGuard之——代码混淆

    ProGuard之——代码混淆 2015年11月03日 21:39:40 阅读数:2756 标签: JavaProGuard 更多 个人分类: JAVA 所属专栏: Java 版权声明:本文为博主原创 ...