bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)


cogs

zoj

bzoj-权限


题解

bzoj和zoj都是骗访问量的233,我没有权限

带修改区间k小值,看了学习了题解一次AC真开心。。。

不带修改的是前缀和套主席树,\(O(log_2n)\)查询,要修改只能\(O(nlog_2n)\)乱搞。

把外层前缀和改成树状数组,即第\(i\)个主席树从存\(1\) ~ \(i\)的值域改成存\(i-lowbit(i)+1\) ~ \(i\)的值域。然后修改和查询都是\(O(log_2^2n)\)的。。。(一个\(log\)树状数组另一个线段树)

查询就从两个根相减变成多个根减多个根了,和bit差不多。


Code

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define Fname "dynrank"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define lb(o) ((o)&(-(o)))
#define mid ((l+r)>>1)
typedef long long ll;
il int gi(){
rg int x=0;rg char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
typedef struct node* point;
point null;
struct node{
int data;
point ls,rs;
node(){ls=rs=null,data=0;}
node(point _ls,point _rs){ls=_ls,rs=_rs,data=0;}
};
const int maxn=50001,maxm=10001;
il vd copy(point&a,point b){
if(b==null)a=null;
else a=new node,*a=*b;
}
il vd Updata(point&s,point rt,int l,int r,int&pos,int num){
copy(s,rt);
s->data+=num;
if(l==r)return;
if(mid<pos)Updata(s->rs,rt->rs,mid+1,r,pos,num);
else Updata(s->ls,rt->ls,l,mid,pos,num);
}
il point build(int l,int r){
if(l==r)return new node;
return new node(build(l,mid),build(mid+1,r));
}
point a[18],b[18];
int _a,_b;
il int Query(int l,int r,int k){
while(l<r){
int res=0;
rep(i,1,_a)res+=a[i]->ls->data;
rep(i,1,_b)res-=b[i]->ls->data;
if(res>=k){
rep(i,1,_a)a[i]=a[i]->ls;
rep(i,1,_b)b[i]=b[i]->ls;
r=mid;
}else{
rep(i,1,_a)a[i]=a[i]->rs;
rep(i,1,_b)b[i]=b[i]->rs;
l=mid+1,k-=res;
}
}return l;
}
il vd free(point i){if(i!=null)free(i->ls),free(i->rs),delete i;}
il vd work(){
int n=gi(),m=gi(),N=n;
point root[maxn+maxm];
int num[maxn],data[maxn+maxm];
int A[maxm],B[maxm],K[maxm];
char opt[3];
rep(i,1,n)num[i]=data[i]=gi();
rep(i,1,m){
scanf("%s",opt);
A[i]=gi(),B[i]=gi();
if(opt[0]=='Q')K[i]=gi();
else K[i]=-1,data[++N]=B[i];
}
sort(data+1,data+N+1);
int tot=unique(data+1,data+N+1)-data-1;
root[0]=build(1,tot);
rep(i,1,n)num[i]=lower_bound(data+1,data+tot+1,num[i])-data,root[i]=root[i-1];
rep(i,1,n)for(rg int j=i;j<=n;j+=lb(j))Updata(root[j],root[j],1,tot,num[i],1);
rep(i,1,m){
if(K[i]==-1){
B[i]=lower_bound(data+1,data+tot+1,B[i])-data;
for(rg int j=A[i];j<=n;j+=lb(j))Updata(root[j],root[j],1,tot,num[A[i]],-1);
num[A[i]]=B[i];
for(rg int j=A[i];j<=n;j+=lb(j))Updata(root[j],root[j],1,tot,num[A[i]],1);
}else{
_a=_b=0;
for(rg int j=B[i];j;j-=lb(j))a[++_a]=root[j];
for(rg int j=A[i]-1;j;j-=lb(j))b[++_b]=root[j];
printf("%d\n",data[Query(1,tot,K[i])]);
}
}
}
int main(){
freopen(Fname".in","r",stdin);
freopen(Fname".out","w",stdout);
int T=gi();
null=new node;
null->ls=null->rs=null;
while(T--)work();
return 0;
}

bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)的更多相关文章

  1. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

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

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

  3. zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap

    Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  4. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  5. ZOJ2112 Dynamic Rankings 动态区间第K最值 平方分割

    有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁 ...

  6. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  7. bzoj1901:Zju2112 Dynamic Rankings

    思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久 ...

  8. 【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 ...

  9. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

随机推荐

  1. 1295. [SCOI2009]最长距离【最短路】

    Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...

  2. 【[NOI2010]超级钢琴】

    我竟然又在写主席树 现在可是九月啦,我却还在写这种noip不可能考的算法 我觉得我真的要凉 题意很明确,就是给你一个序列,让从中选择\(k\)段连续的序列,长度必须大于等于\(L\)小于等于\(R\) ...

  3. 6、Dubbo-配置(1)

    覆盖关系 下图展示了配置覆盖关系的优先级,从上到下优先级依次降低: 参考官网:http://dubbo.apache.org/zh-cn/docs/user/configuration/configu ...

  4. Python 多线程 使用线程 (二)

    Python中实现多线程需要使用到 threading 库,其中每一个 Thread类 的实例控制一个线程. Thread类 #类签名 def __init__(self, group=None, t ...

  5. 测试用例组合--PICT

    测试用例组合 一原理 1.配对组合原理(两两组合原理),应用工具PICT自动输出组合 name=a,b value=1,2 key=m,n 如果自己组合那么有2*2*2=8条用例 a1m a2m a1 ...

  6. 【51nod 1685】 第K大区间2

    题目描述: 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 [ ...

  7. Jmeter--thrift接口压测,调用jar包失败报错:java.lang.NoSuchMethodError:

    调用thrift接口压测的jar包,出现了错误:java.lang.NoSuchMethodError: 错误可能的原因: 有这个类,该类真的没有这个方法 有这个类,而且有好几个,他们之间发生了冲突 ...

  8. 解决Windows下编辑脚本上传到Linux后遇到^M的方法

    Windows下编辑脚本上传到Linux后遇到^M,导致脚本无法执行,原因是因为Linux与Windows对 "回车键" 编码不同 解决方法如下: 在使用UE->文件-> ...

  9. iOS 类似微博或朋友圈的信息流

    1.先上图:   image.png   image.png 因为做过了好几次这样的需求,所以这次想到把它拿出来,下次再需要做的时候直接拿过来改改就能用了,节约时间. 2.功能 文字收起和展开,行高自 ...

  10. scrapy管道MySQL简记

    import pymysqlfrom scrapy.exceptions import DropItemimport time class ErshouchePipeline(object): def ...