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. PCB SQL SERVER 字段模糊匹配个数 实现方法

    今天工程系统给到加投加投组件的数据规则修改,遇到需将一个字段模糊匹配的个数统计 这类需求要平时应该很少遇到了,这里将此方法分享出来, 一.需求如下 例子:itempara字段中的内容是: IVH板 铜 ...

  2. discuz的全局变量

    $_G 保存了 discuz! 中所有的预处理数据 缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可. Discuz! 中所有的缓存保存在 $_G[c ...

  3. [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. 乐字节-Java8核心特性实战之函数式接口

    什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...

  5. Akka源码分析-Remote-位置透明

    上一篇博客中,我们研究了remote模式下如何发消息给远程actor,其实无论如何,最终都是通过RemoteActorRef来发送消息的.另外官网也明确说明了,ActorRef是可以忽略网络位置的,这 ...

  6. 拼接sql ()

    SELECT ID,FORMNAME,NODENAME,SEQUENCE, NAME, STATE, NOWTIMES,      WORK.FQREALNAME||'('||FQDEPT.FULLN ...

  7. github fork项目更改后与原作者同步更新

    1.进入你的GitHub发起Pull request 2.选择compare across forks 3.反向操作.base fork改为自己的,head fork改为原作者的 4.点击 creat ...

  8. $P2126 Mzc家中的男家丁$

    problem #ifdef Dubug #endif #include <bits/stdc++.h> using namespace std; typedef long long LL ...

  9. flask中路由系统

    flask中的路由我们并不陌生,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 1 ...

  10. ACM_迟到的祝福(四)

    迟到的祝福(四) Time Limit: 2000/1000ms (Java/Others) Problem Description: 据说前几天是雁来师姐的生日,作为一个15级的小鲜肉A,没及时给师 ...