题意概述:带修改求区间第k大。

分析:

  我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN)。

  然而这里可以修改,主席树显然是凉了,但是注意到主席树的不带修改做法实际上是利用的差分的性质,即主席树本身实际上就是维护的一个前缀和一样的东西。想想普通的前缀和问题,我们求带修改前缀和是怎么做的?树状数组!于是我们用树状数组套线段树,树状数组里面每个点是一棵权值线段树,维护的是位置i前面lowbit(i)范围中的元素的权值信息,每一次更新的时候在logN棵线段树里修改,询问的时候logN棵线段树里一起走,在线段树上二分(树状数组套在外面写起来简单)。

  由于这个题对时间效率要求不是很高我就直接动态开点了没有离散化也没有卡常。实际上就是我比较懒

  时间复杂度O((N+M)logN^2)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int maxn=;
const int up=; int N,M,a[maxn];
struct mstruct{
static const int maxnode=;
static const int maxl=;
int rt[maxl],np,lc[maxnode],rc[maxnode],sz[maxnode];
int q1[maxl],q2[maxl],l1,l2;
mstruct(){ np=,sz[]=; memset(rt,,sizeof(rt)); }
int lowbit(int i){ return i&(-i); }
void pushup(int now){ sz[now]=sz[lc[now]]+sz[rc[now]]; }
void inupdate(int &now,int L,int R,int p,int v){
if(!now) now=++np,lc[now]=rc[now]=sz[now]=;
if(L==R){ sz[now]+=v; return; }
int m=L+R>>;
if(p<=m) inupdate(lc[now],L,m,p,v);
else inupdate(rc[now],m+,R,p,v);
pushup(now);
}
void update(int p,int v,bool c){
int i=p;
while(i<=N){
if(c) inupdate(rt[i],,up,a[p],-);
inupdate(rt[i],,up,v,);
i+=lowbit(i);
}
a[p]=v;
}
void mov(bool rig){
for(int i=;i<l1;i++) q1[i]=rig?rc[q1[i]]:lc[q1[i]];
for(int i=;i<l2;i++) q2[i]=rig?rc[q2[i]]:lc[q2[i]];
}
int inquery(int L,int R,int k){
if(L==R) return L;
int m=L+R>>,s1=,s2=;
for(int i=;i<l1;i++) s1+=sz[lc[q1[i]]];
for(int i=;i<l2;i++) s2+=sz[lc[q2[i]]];
if(k<=s2-s1){ mov(); return inquery(L,m,k); }
mov(); return inquery(m+,R,k-(s2-s1));
}
int query(int L,int R,int k){
l1=l2=;
int i=L; while(i) q1[l1++]=rt[i],i-=lowbit(i);
i=R; while(i) q2[l2++]=rt[i],i-=lowbit(i);
return inquery(,up,k);
}
}tt; void data_in()
{
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++) scanf("%d",&a[i]);
for(int i=;i<=N;i++) tt.update(i,a[i],);
}
void work()
{
char op[];
int l,r,k,t;
for(int i=;i<=M;i++){
scanf("%s",op);
if(op[]=='C'){
scanf("%d%d",&l,&t);
tt.update(l,t,);
}
else if(op[]=='Q'){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",tt.query(l-,r,k));
}
}
}
int main()
{
data_in();
work();
return ;
}

BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树的更多相关文章

  1. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  2. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  3. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

  4. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  5. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

  6. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  7. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  8. 【序列操作IV】树状数组套线段树/树套树

    题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...

  9. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

随机推荐

  1. node引入bootstrap npm报错

    今天node引入bootstrap npm报错 但是页面正常显示   最后发现bootstrap.min.js.map没有放在文件里  虽然不用页面中引入    另外也发现了怎么看这种错误了

  2. code#5 P3 我有矩阵,你有吗?

    我有矩阵,你有吗?   时间限制: 1.0 秒 空间限制: 128 MB 相关文件: 题目目录 题目描述 企鹅豆豆手里有两个 01 矩阵 A 和 B.他可以进行两种操作: 选择 A 矩阵的一行,然后把 ...

  3. activemq的搭建、启动,简单demo

    一.搭建activeMQ 在官网下载window版本,直接解压就可以. 二.启动 在解压完的目录/bin/win64,双击击activemq.bat,运行完之后打开浏览器,输入http://127.0 ...

  4. 解决 Cydia 源显示空白的问题

    打开 Cydia 所有源都显示空白,没有任何插件,已安装的列表也显示空白,解决方法是下载 var.lib_tar 包 下载链接: https://pan.baidu.com/s/1jzJ8KehoBo ...

  5. maven添加本地jar

    maven有时需要添加了一些本地jar,记录下流程 1.在项目名下创建一个文件夹,起名为lib吧,放要的jar放进去 2.然后打开jar在的路径,打开命令窗口,执行 mvn install:insta ...

  6. NFS服务的搭建

    NFS服务的作用:提供网络文件系统给客户机 nfs服务器的安装配置和使用: 1.将已经制作好的文件系统rootfs_fs210_audio.tgz 拷贝到 /opt,并解压(这里的/opt目录是通过s ...

  7. 嵌入式C语言自我修养 11:有一种函数,叫内建函数

    11.1 什么是内建函数 内建函数,顾名思义,就是编译器内部实现的函数.这些函数跟关键字一样,可以直接使用,无须像标准库函数那样,要 #include 对应的头文件才能使用. 内建函数的函数命名,通常 ...

  8. ruby Rspec+jenkins+allure持续集成

    1.Allure2使用说明 2.ruby下载allure的gem gem install allure-rspec 3.修改源码 C:\Ruby23-x64\lib\ruby\gems\2.3.0\g ...

  9. Bessel函数的零点计算 MATLAB

    由于MATLAB自己没有附带贝塞尔函数零点,因此使用起来很不方便,特别是在绘制仿真场量时. 下面给出0-9阶的贝塞尔函数零点的计算公式,其中理论上计算零点个数N在50以内时较为精确: function ...

  10. 20155322 2016-2017-2 《Java程序设计》 第一周学习总结

    20155322 2016-2017-2 <Java程序设计> 第一周学习总结 教材学习内容总结 本周学习内容的主要是: 一.浏览教材,根据自己的理解每章提出一个问题. 在浏览教材后,我提 ...