【BZOJ】【1901】【Zju2112】 Dynamic Rankings
再填个坑。
动态维护区间第K大(带单点修改)
首先裸的区间第K大我们是用的【前缀和】思想,实现O(n)预处理,O(1)找树查询,那么如果是动态的呢?我们可以利用树状数组(BIT)的思想,进行O(logn)的修改,O(logn)的查询(当然由于是在线段树上做,都各需要再乘logn的复杂度)
也就是说,每次修改,一块改logn棵线段树;每次查询也是在logn棵线段树上一起往下找!
P.S.本题需将所有数(包括修改后的数)进行离散化
//BZOJ 1901
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N=; struct Tree{
int cnt,l,r;
}t[N*];
int n,m,num=,root[N],a[N>>],b[N],dat[N>>][],size=,cnt=;
int lc,rc,ln[N],rn[N]; #define mid (l+r>>1)
void build(int &o,int l,int r){
o=++cnt; t[o].cnt=;
if (l==r) return;
build(t[o].l,l,mid);
build(t[o].r,mid+,r);
} void updata(int &o,int l,int r,int pos,int val){
t[++cnt]=t[o],o=cnt,t[o].cnt+=val;
if (l==r) return;
if (pos <= mid) updata(t[o].l,l,mid,pos,val);
else updata(t[o].r,mid+,r,pos,val);
} void modify(int x,int pos,int val){
for(x;x<=n;x+=lowbit(x) )//一次改logn棵树
updata(root[x],,num,pos,val);
} int query(int i,int j,int rank){
int l=,r=num;
int tl=,tr=; while(l!=r){
tl=tr=;
F(i,,lc) tl+=t[t[ln[i]].l].cnt;//将logn棵树的和加出来
F(i,,rc) tr+=t[t[rn[i]].l].cnt;
if (tr-tl>=rank){
F(i,,lc) ln[i]=t[ln[i]].l;//向左找
F(i,,rc) rn[i]=t[rn[i]].l;
r=mid;
}
else{
F(i,,lc) ln[i]=t[ln[i]].r;//向右找
F(i,,rc) rn[i]=t[rn[i]].r;
l=mid+; rank-=tr-tl;
} }
return l;
}
#undef mid
int getans(int l,int r,int k){
rc=lc=;
for(r;r;r-=lowbit(r))
rn[++rc]=root[r];
for(l;l;l-=lowbit(l))
ln[++lc]=root[l];
return query(,num,k);
} void solve(){
sort(b+,b+size+);
num=unique(b+,b+size+)-b-;//这个神奇的用法……是什么意思?
F(i,,n) a[i]=lower_bound(b+,b+num+,a[i])-b;
build(root[],,num);
F(i,,n) modify(i,a[i],);
F(i,,m){
if(dat[i][]==) printf("%d\n",b[ getans(dat[i][]-,dat[i][],dat[i][]) ]);
else{
int pos=lower_bound(b+,b+num+,dat[i][])-b;
modify(dat[i][],a[dat[i][]],-);
a[dat[i][]]=pos;
modify(dat[i][],a[dat[i][]],);
}
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("file.in","r",stdin);
#endif
int T=;
// scanf("%d",&T);
while(T--){
size=cnt=num=;
memset(b,,sizeof b);
memset(t,,sizeof t);
memset(dat,,sizeof dat);
scanf("%d%d",&n,&m);
F(i,,n){
scanf("%d",&a[i]);
b[++size]=a[i];
}
char cmd[];
F(i,,m){
scanf("%s",cmd);
if (cmd[]=='C'){
dat[i][]=;
scanf("%d%d",&dat[i][],&dat[i][]);
b[++size]=dat[i][];
}
else{
dat[i][]=;
scanf("%d%d%d",&dat[i][],&dat[i][],&dat[i][]);
}
}
solve();
}
return ;
}
/**************************************************
利用BIT的思想,实现前缀-差分的logn的转化
裸的可持久化线段树是每棵树维护一个区间[1,i](前缀和)
查询O(1),而修改就需要 O(n)了
而动态进行修改&查询-->BIT里套一个可持久化线段树
BIT的每个节点表示原数组的一个区间
然后用可持久化线段树来维护这个区间
查询的时候log(n)棵线段树一起查
**************************************************/
【BZOJ】【1901】【Zju2112】 Dynamic Rankings的更多相关文章
- 【BZOJ 2754 喵星球上的点名】
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2512 Solved: 1092[Submit][Status][Discuss] Descript ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】【1025】【SCOI2009】游戏
DP/整数拆分 整个映射关系可以分解成几个循环(置换群的预备知识?),那么总行数就等于各个循环长度的最小公倍数+1(因为有个第一行的1~N).那么有多少种可能的排数就等于问有多少种可能的最小公倍数. ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang
点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
随机推荐
- jMeter 监控cpu、内存
http://jmeter-plugins.org/downloads/all/ 将JMeterPlugins.jar包复制到Jmeter的lib目录下面的ext目录下面,重新启动Jmeter,我们点 ...
- Spark和Hadoop作业之间的区别
Spark目前被越来越多的企业使用,和Hadoop一样,Spark也是以作业的形式向集群提交任务,那么在内部实现Spark和Hadoop作业模型都一样吗?答案是不对的. 熟悉Hadoop的人应该都知道 ...
- Yii 增删改查 测试记录
亲们, 我是yii小白 不要笑话我奥.今天白天写一个管理模块涉及到 yii ar 下的 curd 操作,做 update 操作时纠结了好久,今天晚上花点时间学习, 下面写下我的测试记录 代码如下: ...
- Cache-control使用:header('Cache-control:private')
发布:thebaby 来源:net [大 中 小] 转自:http://www.jbxue.com/article/5624.html网页缓存由 HTTP消息头中的“Cache-contr ...
- Adapter的getView方法详解
来自:http://blog.csdn.net/yelbosh/article/details/7831812 BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是 ...
- VLC 重新编译第三方库的预编译包contrib
VLC的引用了很多开源的第三方库,均放到VLC目录下的contrib中(本来开始编译是2.1.x以上版本,以前或以后可能会变化),在Windows版本编译中,contrib文件夹中仅仅下载VLC官网上 ...
- Windows7下Microsoft Office Excel 不能访问文件解决方案
1).开始--〉运行--〉cmd 2)命令提示符下面,输入mmc -32,打开32的控制台 3).文件菜单中,添加删除管理单元--〉组件服务 4).在"DCOM配置"中找到&quo ...
- SQL Server 基础:拾遗
1.一条完整的sql语句: select top | distinct 字段, 表达式, 函数, ... from 表表达式 where 筛选条件 group by 分组条件 having 筛选条件 ...
- 第十五章 调试及安全性(In .net4.5) 之 管理程序集
1. 概述 本章将介绍 什么是程序集.如何强命名程序集.如何把程序集放入GAC.程序集版本 以及 WinMD程序集. 2. 主要内容 2.1 什么是程序集 程序集(Assembly)概念的出现,是为了 ...
- Python os模块常用部分功能
os.sep 可以取代操作系统特定的路径分割符. os.name字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os.getcw ...