[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小,需要一些能 ...
随机推荐
- HttpPostedFileBase 基类
public void uploadDocMentSave(string Type) { if (Request.Files.Count > 0) { Htt ...
- 《Typecript 入门教程》 2、访问控制符:public、private、protected、readonly
声明类的属性和方法时可以设置使用访问控制符,访问控制符设置类的属性和方法能不能在类的外部被访问 1. 默认为 public,使用public定义的属性和方法在类的内部和外部都可以访问 2. priva ...
- JavaScript--二维数组
一维数组,我们看成一组盒子,每个盒子只能放一个内容. 一维数组的表示: myarray[ ] 二维数组,我们看成一组盒子,不过每个盒子里还可以放多个盒子. 二维数组的表示: myarray[ ][ ] ...
- Codeforces 792D
题意:给定一棵拥有n个节点的满二叉树(即n==2^x-1),q个查询,每次给出一个节点的编号,再给出一个由L,R,U组成的字符串序列,依次表示向左子节点.右子节点.父节点移动,如果移动不合法,则忽略. ...
- Elasticsearch之CURL命令的DSL查询
它是Domain Specific Language领域特定语言. https://www.elastic.co/guide/en/elasticsearch/reference/current/in ...
- 实现一个类似于收趣APP的功能
近日想做一个类似于收趣APP软件的一个功能,将头条.微信等其他App的文章能够通过分享微信好友的方式分享到自己的平台软件中. 分享的方式有三种: 1.通过微信好友的方式,将文章分享给收趣. 2.复制文 ...
- C++ Primer(第4版)-学习笔记-第2部分:容器和算法
第9章 顺序容器 顺序容器和关联容器 顺序容器内的元素按其位置存储和访问. 关联容器,其元素按键(key)排序. 顺序容器(sequential container). 顺序容器的元素排列次序与元素值 ...
- CSS——轮播图中的箭头
注意事项: 1.定位中left权重比right高,top权重比bottom高 2.两个span标签嵌套在一个盒子中,将来显示隐藏只需要控制父盒子就行了 <!DOCTYPE html> &l ...
- CentOS 7 使用 yum 安装 MariaDB 与 MariaDB 的简单配置
闲置已久的空间环境配置忘得差不多了,今天得空整理,重置了磁盘重新搭建环境,首先安装MariaDB的数据库,在这里记录下安装过程,以便以后查看. 1.安装MariaDB 安装命令 yum -y inst ...
- 【译】x86程序员手册20-6.3.4门描述符守卫程序入口
6.3.4 Gate Descriptors Guard Procedure Entry Points 门描述符守卫程序入口 To provide protection for control tra ...