题目链接:戳我

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

我们都知道主席树是利用前缀和记录历史版本来搞区间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. Bootstrip 的select的数据绑定问题

    这个问题浪费了我整整一个下午时间 最后终于解决了  这里来备份一下 $(function(){ var stu_no = freeUrl(); var data, subname="&quo ...

  2. url_encode and url_decode in Shell

    之前写过一版 shell下解码url,下面给出另外一个版本 from https://gist.github.com/cdown/1163649 function urlencode() { loca ...

  3. mysql数据库怎么安装到自己的电脑上?

    安装mysql1.安装过程中输⼊入Y确认继续安装 2.设置密码1.第⼀一次设登陆密码 2.第⼆二次验证密码 安装完成

  4. 运动函数封装(js)

    // 运动函数 function starMove(obj,json,fnEnd){ clearInterval(obj.timer); obj.timer  = setInterval(functi ...

  5. 使用cloudrea manager管理已有的cdh集群(转)

    转自:http://blog.51cto.com/teacheryan/1912116 本文介绍如何搭建cloudera manager去接入已有hadoop组件(cdh). 一.下载必备文件: 1. ...

  6. mysql的my.ini配置文件

    第一步,我们找到mysql安装文件下面的my.ini文件,打开可以看到第一句: # MySQL Server Instance Configuration File Mysql服务实例配置文件 好,咱 ...

  7. bootstrap-select用法详解

    首先需要引入 <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href=&quo ...

  8. 【hdu4135】【hdu2841】【hdu1695】一类通过容斥定理求区间互质的方法

    [HDU4135]Co-prime 题意 给出三个整数N,A,B.问在区间[A,B]内,与N互质的数的个数.其中N<=10^9,A,B<=10^15. 分析 容斥定理的模板题.可以通过容斥 ...

  9. java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~

    项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益.于是,哈哈哈 public static <T& ...

  10. 303. Range Sum Query 范围求和系列

    Immutable [抄题]: Given an integer array nums, find the sum of the elements between indices i and j (i ...