题目链接:戳我

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

我们都知道主席树是利用前缀和记录历史版本来搞区间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. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 14—Dimensionality Reduction 降维

    Lecture 14 Dimensionality Reduction 降维 14.1 降维的动机一:数据压缩 Data Compression 现在讨论第二种无监督学习问题:降维. 降维的一个作用是 ...

  2. Linux实战教学笔记32:企业级Memcached服务应用实践

    一, Memcached介绍 1.1 Memcached与常见同类软件对比 (1)Memcached是什么? Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共 ...

  3. JS遍历子孙树

    function fn(dataList,parent_id){     var result = [] , temp;     for(var i in dataList){         if( ...

  4. zabbix结合grafana

    一.下载grafana 下载地址: http://docs.grafana.org/installation/rpm/ https://s3-us-west-2.amazonaws.com/grafa ...

  5. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. Jenkins一天中构建多次

    Build after other projects are built:在其他项目触发的时候触发,里面有分为三种情况,也就是其他项目构建成功.失败.或者不稳定的时候触发项目: Poll SCM:定时 ...

  7. java判断一个数是否为素数[转]

    http://blog.csdn.net/lwcumt/article/details/8027586 import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中 ...

  8. sql server锁检测

    有时候系统运行老感觉效率不高,并且有时候sql还有超时的报错,但是并发量并不高.通过排查定位sql是否有执行效率问题 -- 开事务, 以保持锁 BEGIN TRAN -- 更新 update tabl ...

  9. spring Aop概念

    面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面.切面能对关注点进行模块化 ...

  10. Arch Linux freemind中文乱码

    原因:jre没有可用的中文字体 解决方法: (1) 安装中文字体,例如文泉驿微黑 pacman -S wqy-microhei (2) jre字体目录下建立fallback,并链接中文字体作为后备字体 ...