BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第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 树状数组套线段树的更多相关文章
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- 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[ ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- 【序列操作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 ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
随机推荐
- python3爬虫-爬取B站排行榜信息
import requests, re, time, os category_dic = { "all": "全站榜", "origin": ...
- http 协议状态码
1xx 信息类状态码 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) 101 - Switching Protocols 服务器将遵从客户 ...
- CH4402 小Z的袜子(莫队)
描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号, ...
- 洛谷P3690 【模板】Link Cut Tree (LCT)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- Ajax与Xml
Ajax就是用javascript来实现的 主要是用来实现页面的局部刷新,比如当你在百度上回答别人的问题时候,没有登录,页面会弹出一个窗口,让你输入账号和密码,这就是利用ajax来做的,如果不是aja ...
- Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.
最近在开发一个网站时,有个需要是 如果有新预警信息要在网页中播放提示音.页面打开会请求是否有新信息,有则播放提示音.在Chrome的最新浏览器中,播放会报错,控制台显示Uncaught (in pro ...
- 我的 Delphi 学习之路 —— Delphi 的安装
标题:我的 Delphi 学习之路 -- Delphi 的安装 作者:断桥烟雨旧人伤 1. Delphi 版本的选择 Delphi 版本众多,我该选择哪一个,这确实是个问题,自从 Borland 公司 ...
- HIve安装模式
Hive的安装模式: 1. 嵌入模式:HIve将元信息存储到自带derby数据库中,只能创建一个连接,只用于演示使用 2. 本地模式:元信息被存在Mysql数据库,Mysql数据库与HIve运行在同一 ...
- ruby rspec+jenkins+ci_report持续集成生成junit测试报告
1.加载ci_report gem install ci_reporter_rspec 2.给测试工程编写rakefile require 'ci/reporter/rake/rspec' requi ...
- 20155229 2016-2017-2 《Java程序设计》第十周学习总结
20155229 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络 网络分为局域网.广域网.城域网 一次HTTP请求包含3个部分:①方法--统一资源标识符 ...