【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
【BZOJ1901】Zju2112 Dynamic Rankings
Description
给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。
Input
第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。
Output
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
Sample Input
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
6
HINT
20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。
题解:对于动态修改的问题,我们采用树状数组套主席树的做法(但还是离线)。什么叫树状数组套主席树呢?
就是正常的主席树每棵线段树保存的是[1,i]这个区间,而这里的主席树相当于保存的相当于树状数组上[1,i-lowbit+1]+...+[1,i]这些线段树的和,所以我们在查询的时候就要同时在logn棵线段树上查询。那么在修改时我们每修改一个数,也要新建logn棵线段树。
还有注意这题是a[i]可以等于0
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=20010;
int n,m,tot,nm,ta,tb;
struct NUM
{
int num,org;
}v[maxn];
struct NODE
{
int ls,rs,siz;
}s[maxn*200];
int qa[maxn],qb[maxn],qc[maxn],qk[maxn],ref[maxn],root[maxn];
int now[maxn],pos[maxn],val[maxn],sa[maxn],sb[maxn];
char str[5];
bool cmp1(NUM a,NUM b)
{
return a.num<b.num;
}int readin()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9'){if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void insert(int x,int &y,int l,int r,int p,int q)
{
y=++tot;
if(l==r)
{
s[y].siz=s[x].siz+q;
return ;
}
int mid=l+r>>1;
if(p<=mid) s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,p,q);
else s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,p,q);
s[y].siz=s[s[y].ls].siz+s[s[y].rs].siz;
}
int query(int l,int r,int p)
{
if(l==r) return ref[l];
int i,suma=0,sumb=0;
int mid=l+r>>1;
for(i=1;i<=ta;i++) suma+=s[s[sa[i]].ls].siz;
for(i=1;i<=tb;i++) sumb+=s[s[sb[i]].ls].siz;
if(sumb-suma>=p)
{
for(i=1;i<=ta;i++) sa[i]=s[sa[i]].ls;
for(i=1;i<=tb;i++) sb[i]=s[sb[i]].ls;
return query(l,mid,p);
}
else
{
for(i=1;i<=ta;i++) sa[i]=s[sa[i]].rs;
for(i=1;i<=tb;i++) sb[i]=s[sb[i]].rs;
return query(mid+1,r,p-sumb+suma);
}
}
int main()
{
n=readin(),m=readin();
int i,j,a,b,pre;
for(i=1;i<=n;i++) v[++nm].num=readin(),v[nm].org=nm;
for(i=1;i<=m;i++)
{
scanf("%s",str);
qa[i]=readin(),qb[i]=readin();
if(str[0]=='Q') qc[i]=readin();
else v[++nm].num=qb[i],v[nm].org=n+i,qk[i]=1;
}
sort(v+1,v+nm+1,cmp1);
for(ref[pre=0]=-1,i=1;i<=nm;i++)
{
if(v[i].num>ref[pre]) ref[++pre]=v[i].num;
if(v[i].org>n) qb[v[i].org-n]=pre;
else val[v[i].org]=pre;
}
for(i=1;i<=n;i++)
for(j=i;j<=n;j+=j&-j)
insert(root[j],root[j],1,nm,val[i],1);
for(i=1;i<=m;i++)
{
if(qk[i]==1)
{
for(j=qa[i];j<=n;j+=j&-j) insert(root[j],root[j],1,nm,val[qa[i]],-1);
val[qa[i]]=qb[i];
for(j=qa[i];j<=n;j+=j&-j) insert(root[j],root[j],1,nm,qb[i],1);
}
else
{
for(ta=0,j=qa[i]-1;j;j-=j&-j) sa[++ta]=root[j];
for(tb=0,j=qb[i];j;j-=j&-j) sb[++tb]=root[j];
printf("%d\n",query(1,nm,qc[i]));
}
}
}
【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组的更多相关文章
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- BZOJ1901 Zju2112 Dynamic Rankings 主席树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- [BZOJ1901]Zju2112 Dynamic Rankings
[BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
- bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】
题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...
- BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】
题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
随机推荐
- 基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序
基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序 不知道为什么,保存的时候显示有一个连接为违禁内容,可能是…………. ...
- [ Laravel 5.1 文档 ] 服务 —— 任务调度
1.简介 在以前,开发者需要为每一个需要调度的任务编写一个Cron条目,这是很让人头疼的事.你的任务调度不在源码控制中,你必须使用SSH登录到服务器然后添加这些Cron条目.Laravel命令调度器允 ...
- js学习笔记19----getElementsByClassName函数封装
js里面的getElementsByClassName()方法可通过某个class名获取到元素,在标准浏览器下可使用,在非标准浏览器下不可用.为了能够让这个方法兼容所有的浏览器,可以封装成如下函数: ...
- bootstrap首页案例
<html><head> <meta http-equiv="Content-Type" content="text/html; chars ...
- 丰富您设计的10个CSS3效果库
Magic CSS3 Animations Magic CSS3 Animations是一个CSS3动画包,拥有一些特效可以你的Web项目中免费使用.拥有像金光闪闪,角度,旋转,炸弹等特殊效果.使用简 ...
- 将ORACLE数据库更改为归档模式;写出步骤
解答:具体步骤如下: 1),以exp方式在线备份数据库到指定位置: 2),观察当前数据库是以服务器参数文件(spfile)方式启动还是以参数文件(pfile)方式启动: SQL> show pa ...
- h264 i p 帧特点
1.爱无铭(47530789) 2014-2-13 17:07:27 I帧只有intra p帧有inter和intra:B帧一般只用inter 2. 庐舍闲士(361389535) 2014-2 ...
- myslq的索引类型为MyISAM和BDB的表:复合索引下的自增长
本文源自:http://www.himigame.com/mysql/781.html 3.6.9. 使用AUTO_INCREMENT 可以通过AUTO_INCREMENT属性为新的行产生唯一的标识: ...
- solr 5.2.1 tomcat 7 配置过程笔记
因为这个是新版,网上很少这个配置文档,看网上其他的教程弄了很多次,都没有成功,幸亏有这个链接的文档, 才迅速的配置成功,其实是比以前简洁了.因为我的在 linux 上面安装,不方便截图,直接复制修改了 ...
- 图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen
图像的降采样与升采样(二维插值) 1.先说说这两个词的概念: 降采样,即是采样点数减少.对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像.降采样很容 ...