所谓带修主席树,就是用树状数组的方法维护主席树的前缀和

思路

带修主席树的板子

注意数据范围显然要离散化即可

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
int sz,lson,rson;
}PT[100100*400];
struct Q{
char c;
int l,r,x,val;
}opt[100100];
const int MAXV = 1e9+10;
int Nodecnt,lcnt,rcnt,root[100100],n,m,a[100100],num[200100],nx;
int lroot[100100],rroot[100100];
int lowbit(int x){
return x&(-x);
}
void update(int L,int R,int &o,int c,int x){
PT[++Nodecnt]=PT[o];
o=Nodecnt;
PT[o].sz+=c;
if(L==R)
return;
int mid=(L+R)>>1;
if(x<=mid)
update(L,mid,PT[o].lson,c,x);
else
update(mid+1,R,PT[o].rson,c,x);
}
int query(int l,int r,int L,int R,int k){
lcnt=0,rcnt=0;
for(int i=L-1;i;i-=lowbit(i))
lroot[++lcnt]=root[i];
for(int i=R;i;i-=lowbit(i))
rroot[++rcnt]=root[i];
while(l<=r){
if(l==r)
return l;
int lch=0,mid=(l+r)>>1;
for(int i=1;i<=rcnt;i++)
lch+=PT[PT[rroot[i]].lson].sz;
for(int i=1;i<=lcnt;i++)
lch-=PT[PT[lroot[i]].lson].sz;
if(k>lch){//to right
for(int i=1;i<=rcnt;i++)
rroot[i]=PT[rroot[i]].rson;
for(int i=1;i<=lcnt;i++)
lroot[i]=PT[lroot[i]].rson;
k-=lch;
l=mid+1;
}
else{
for(int i=1;i<=rcnt;i++)
rroot[i]=PT[rroot[i]].lson;
for(int i=1;i<=lcnt;i++)
lroot[i]=PT[lroot[i]].lson;
r=mid;
}
}
}
void set(int pos,int x,int c){//x-c
while(pos<=n){
update(1,nx,root[pos],c,x);
pos+=lowbit(pos);
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
num[++nx]=a[i];
}
for(int i=1;i<=m;i++){
char c=getchar();
while(c!='Q'&&c!='C')
c=getchar();
if(c=='Q'){
opt[i].c='Q';
scanf("%d %d %d",&opt[i].l,&opt[i].r,&opt[i].val);
}
else{
opt[i].c='C';
scanf("%d %d",&opt[i].val,&opt[i].x);
num[++nx]=opt[i].x;
}
}
sort(num+1,num+nx+1);
nx=unique(num+1,num+nx+1)-num-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(num+1,num+nx+1,a[i])-num;
for(int i=1;i<=m;i++)
if(opt[i].c=='C')
opt[i].x=lower_bound(num+1,num+nx+1,opt[i].x)-num;
for(int i=1;i<=n;i++)
set(i,a[i],1);
for(int i=1;i<=m;i++){
if(opt[i].c=='Q'){
printf("%d\n",num[query(1,nx,opt[i].l,opt[i].r,opt[i].val)]);
}
else{
set(opt[i].val,a[opt[i].val],-1);
set(opt[i].val,opt[i].x,1);
a[opt[i].val]=opt[i].x;
}
}
return 0;
}

P2617 Dynamic Rankings(带修主席树)的更多相关文章

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

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

  2. BZOJ1901 Dynamic Rankings|带修主席树

    题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...

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

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

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

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

  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. 带修主席树 洛谷2617 支持单点更新以及区间kth大查询

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

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

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

随机推荐

  1. sitecore系列教程之Sitecore个性化-体验概况概述

    SITECORE 8:体验概况概述 什么是体验简介? 体验配置文件是Sitecore中的仪表板应用程序,它说明了客户体验和交互的关键区域,例如访问者详细信息,访问,活动,目标,配置文件,自动化等等. ...

  2. mysql运用now(3)存储时间到毫秒

    ) from DUAL;

  3. 微信小程序项目

    大体思想 微信小程序,没有DOM和BOM概念,所以,不会涉及到操作节点.它的主要思想是操作数据,然后改变视图层,即MVVM,如果知道angularJS,能很快的理解上手小程序.   一些开发小程序时, ...

  4. qDeleteAll 之后必须清空容器

    [1]qDeleteAll应用示例 qDeleteAll源码如下: template <typename ForwardIterator> Q_OUTOFLINE_TEMPLATE voi ...

  5. 关于JS的几个基础题目

    1.截取字符串abcdefg的efg alert("abcdefg".substring(4)); 2.判断一个字符串中出现次数最多的字符,统计这个次数 var str = 'as ...

  6. flask模板应用-空白控制

    模板应用实践 空白控制 在实际输出的HTML文件中,模板中的jinja2语句.表达式和注释会保留移除后的空行. 例如下面的代码: {% set user.age = 23 %} {% if urer. ...

  7. Android百大框架排行榜

    Android百大框架排行榜 15类Android通用流行框架 - 流风,飘然的风 - 博客园https://www.cnblogs.com/zdz8207/p/android-opensource- ...

  8. Django框架----Form组件补充

    一.Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1.Django内置字段如下: 1 Field 2 required=T ...

  9. Python爬虫【四】Scrapy+Cookies池抓取新浪微博

    1.设置ROBOTSTXT_OBEY,由true变为false 2.设置DEFAULT_REQUEST_HEADERS,将其改为request headers 3.根据请求链接,发出第一个请求,设置一 ...

  10. mysql01

    CREATE TABLE `student`( `studentNo` INT (4) NOT NULL PRIMARY KEY COMMENT '学号', `loginPwd` VARCHAR(20 ...