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_主席树的更多相关文章

  1. BZOJ1901 Zju2112 Dynamic Rankings 主席树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...

  2. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  3. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  4. 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- ...

  5. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  6. bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  7. [BZOJ1901]Zju2112 Dynamic Rankings

    [BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...

  8. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  9. 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings

    n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...

随机推荐

  1. springAOP注解方式定义切入点报错error at ::0 can't find referenced pointcut

    [说明] 1.使用spring版本:4.0.4 2.springAOP相关依赖包: 1)aopalliance-1.0.jar 2)aspectjweaver-1.8.9.jar 3)aspectjr ...

  2. Antenna Placement(二分图的最大匹配)

    http://poj.org/problem?id=3020 题意: 一个矩形中,有N个城市'*',现在这n个城市都要覆盖无线,若放置一个基站,它至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使 ...

  3. Django基于JWT实现微信小程序的登录和鉴权

    什么是JWT? JWT,全称Json Web Token,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. 与Session的区别 一.Session是在服务 ...

  4. Spring Boot (26) RabbitMQ延迟队列

    延迟消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 延迟队列 订单业务: 在电商/点餐中,都有下单后30分钟内没有付款,就自动取消订单. 短 ...

  5. 笨拙而诡异的 Oracle(之二)

    有一张表,很多数据:   想取某个月的数据.初始的想法很简单,根据日期(RQ)形成条件即可:  符合条件的记录数是 129835,但耗时太长:14.515 秒(RQ字段是做过索引的)!直观的反应是 O ...

  6. 显示log里的ansi codecs颜色字符

    方法: vim AnsiEsc插件 http://www.vim.org/scripts/script.php?script_id=302 less -r cat和tail命令都可以正常显示,而且ta ...

  7. 如何在Android Studio中查看一个类的继承关系呢?

    在面板顶部的工具栏中,找到Navigate,然后在下拉列表中,找到“Type Hierarchy”(快捷键 Ctrl+H),点击.即可在面板右侧出现该类的Hierarchy层级图.

  8. centos7 安装zabbix3.4

    1 打开yum安装rpm包,自动存放下载的rpm包 下次安装时,如果没有网可以自己制作yum源 打开文件 [root@localhost etc]# vim /etc/yum.conf keepcac ...

  9. Vue项目优化首屏加载速度

    Vue项目部署上线后经常会发现首屏加载的速度特别慢:那么有那写能做的简单优化呢 一.路由的懒加载 路由懒加载也就是 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件. 结合 ...

  10. EF入门

    1.(安装EF)右键项目