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. Kali-linux在树莓派上破解无线网络

    大部分的命令可以正常的运行在BackTrack5或Kali上.在Kali上可以实现的无线渗透测试,在树莓派上也可以运行.在第1章中介绍了在树莓派上安装Kali Linux操作系统,下面将介绍在树莓派上 ...

  2. 配置mysql允许远程链接

    默认情况下,mysql帐号不允许从远程登陆,只能在localhost登录.本文提供了二种方法设置mysql可以通过远程主机进行连接. 修改用户表的数据 登入mysql后,更改 mysql 数据库里的 ...

  3. PAT——1042. 字符统计

    请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过1000的字符串.字符串由ASCII码表中任意可见字符及空格组成,至少包含1个英文字母,以回车结束( ...

  4. Shell笔记-01

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码: #!/bin/bash ...

  5. BroadcastReceiver(接收广播)

    Broadcast Receiver用于接收并处理广播通知(broadcast announcements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也能够播放一个广播. 程序能 ...

  6. NodeJ node.js基础

    因为是Node服务器端的,怎样实现前台和后台请求以及回应 URL(由什么组成的 ),传输的内容:表单数据  文件数据 [图片.压缩包.各种后缀文件] URL的组成 URL由三部分组成: 协议类型 , ...

  7. js基础(闭包实例)

    1,常用发送短信的闭包实现: function sms() { var count = 60; return { start: function() { if(count == 0) { count ...

  8. 关于2018年第九届蓝桥杯[C++省赛B组][第四题:测试次数]的疑问

    题目来源:https://blog.csdn.net/qq_34202873/article/details/79784548 #标题:测试次数#x星球的居民脾气不太好,但好在他们生气的时候唯一的异常 ...

  9. scrapy管道MySQL简记

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

  10. JQuery模拟网页中自定义鼠标右键菜单

    题外话.......最近在开发一个网站项目的时候,需要用到网页自定义右键菜单,在网上看了各路前辈大神的操作,头晕目眩,为了达到目的,突然灵机一动,于是便有了这篇文章. 先放个效果图(沾沾自喜,大神勿喷 ...