[bzoj1901][Zju2112]Dynamic Rankings_主席树
Dynamic Rankings bzoj-1901 Zju-2112
题目大意:给定一个n个数的序列,m个操作,支持:单点修改;查询区间k小值。
注释:$1\le n,m\le 10^4$。
想法:如果这个教树套树的话,我也没办法。
其实就是借用了树状数组的思想,我们在这里叫它...阉割树状数组把。
具体地,主席树每个节点维护的仍然是前缀权值线段树。
修改的时候将修改的点二进制lowbit分解。在分解的节点的权值线段树上直接修改。
查询时我们将所有区间(左端点-1)都二进制lowbit分解,然后每个点的sum都在delta上修改,判断进左子树还是右子树即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100500
int sum[N<<5],ls[N<<5],rs[N<<5],n,m,root[N<<5];
int sx[N],sy[N],v[N],maxn=1e9+10,cnt,cntx,cnty;
char ch[10];
inline int lowbit(int i){return i&(-i);}
// int build(int l,int r)
// {
// int pos=++cnt,mid=(l+r)>>1;
// if(l==r) return pos;
// ls[pos]=build(l,mid);
// rs[pos]=build(mid+1,r);
// return pos;
// }
int update(int pre,int l,int r,int k,int val)
{
int pos=++cnt,mid=(l+r)>>1;
sum[pos]=sum[pre]+val;
ls[pos]=ls[pre]; rs[pos]=rs[pre];
if(l==r) return pos;
if(k<=mid) ls[pos]=update(ls[pre],l,mid,k,val);
else rs[pos]=update(rs[pre],mid+1,r,k,val);
return pos;
}
int query(int l,int r,int k)
{
if(l==r) return l;
int dlt=0,mid=(l+r)>>1;
for(int i=1;i<=cntx;i++) dlt-=sum[ls[sx[i]]];
for(int i=1;i<=cnty;i++) dlt+=sum[ls[sy[i]]];
if(k<=dlt)
{
for(int i=1;i<=cntx;i++) sx[i]=ls[sx[i]];
for(int i=1;i<=cnty;i++) sy[i]=ls[sy[i]];
return query(l,mid,k);
}
else
{
for(int i=1;i<=cntx;i++) sx[i]=rs[sx[i]];
for(int i=1;i<=cnty;i++) sy[i]=rs[sy[i]];
return query(mid+1,r,k-dlt);
}
}
int main()
{
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
for(int j=i;j<=(n<<1);j+=lowbit(j)) root[j]=update(root[j],0,maxn,v[i],1);
}
for(int i=1;i<=m;i++)
{
scanf("%s%d%d",ch,&x,&y);
if(ch[0]=='C')
{
for(int j=x;j<=n;j+=lowbit(j)) root[j]=update(root[j],0,maxn,v[x],-1);
v[x]=y;
for(int j=x;j<=n;j+=lowbit(j)) root[j]=update(root[j],0,maxn,v[x],1);
}
else
{
scanf("%d",&z);
cntx=cnty=0;
for(int j=x-1;j;j-=lowbit(j)) sx[++cntx]=root[j];
for(int j=y;j;j-=lowbit(j)) sy[++cnty]=root[j];
printf("%d\n",query(0,maxn,z));
}
}
}
/*
5 3 3 2 1 4 7 Q 1 4 3 C 2 6 Q 2 5 3
*/
小结:有趣...
[bzoj1901][Zju2112]Dynamic Rankings_主席树的更多相关文章
- BZOJ1901 Zju2112 Dynamic Rankings 主席树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...
- 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
[BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...
- [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- ...
- 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] ...
- [BZOJ1901]Zju2112 Dynamic Rankings
[BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
- 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings
n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...
随机推荐
- PCB Windows Petya(永恒之蓝)勒索病毒补丁检测代码
公司内部电脑招受到新的勒索病毒Petya(永恒之蓝)攻击,直接导致受攻击的电脑系统崩贵无法启动,这次勒索病毒攻击影响范围之广,IT,人事,工程,生产,物控等部门都无一幸免,对整个公司运转产生了非常严重 ...
- oracle基础学习---------1
1.SQL执行时间的开关 set timing on --->开 set timing off--->关 2.创建数据表.以已存在的表创建(也就是复制一个表.但表内没有数据 ...
- Redis基本属性的使用-详细
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集 ...
- applicationContext.xml配置AOP切面编程
Computer.java package com.wh.aop2; public class Computer { public void play01(){ System.out.println( ...
- P1257 平面上的最接近点对
题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...
- iOS keychain入门
学了很久的iOS,一直都是明文保存用户名和密码在本地,手机一般都是自己用的,而且非越狱手机东西也不怎么能拿到数据,所以也就没在乎那么多,当然,这是不科学的.悄悄的说,这块一直不是我写的~~~ 用户隐私 ...
- iis设置404错误页,返回500状态码
一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...
- 转 IDEA 解决代码提示功能消失
转载路径是 https://blog.csdn.net/hmily_hui/article/details/78213037 原文地址:https://github.com/Damao/Intell ...
- webpack 打包后 Uncaught SyntaxError: Unexpected token <
问题描述:npm run dev 没报错.是可以正常运行的, npm run build 过程也没报错, 但是打开dist index.html 就报错了 错误内容: 解决方法: ...
- Hive扩展功能(八)--表的索引
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...