bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)
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(动态排名系统)的更多相关文章
- [COGS257]动态排名系统 树状数组套主席树
257. 动态排名系统 时间限制:5 s 内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...
- 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
[BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...
- ZOJ2112 Dynamic Rankings 动态区间第K最值 平方分割
有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁 ...
- 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题
达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...
- bzoj1901:Zju2112 Dynamic Rankings
思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久 ...
- 【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 ...
- LuoguP2617 Dynamic Rankings (动态主席树学习理解)
题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...
随机推荐
- Java工具类(util) 之01- 数学运算工具(精确运算)
数学运算工具(精确运算) /** * * @author maple * */ public abstract class AmountUtil { private AmountUtil() { } ...
- MyBatis(2)-全局配置文件
本文的代码是在MyBatis(1)-简单入门基础之上进行学习的,如有不懂请先看此博文MyBatis(1)-简单入门! 1)配置文件的安装 --->在联网的情况下,点击去下载http://myba ...
- 解决Bug步骤
1.看报错.将bug定位到文件.类.方法. 2.打断点.将bug定位到具体代码行号. 3.分析断点输出结果. 4.结合报错和断点结果,修改代码. 总之:拆解问题.定位问题.分析问题.解决问题.
- Ubuntu安装MySQL/MariaDB
安装MariaDB/MySQL MariaDB是MySQL的分支,与MySQL高度兼容,几乎所有的命令都一样.MariaDB是由前MySQL的开发人员离开Sun公司后开发的,目的是为了防止Oracle ...
- PAT——1057. 数零壹
给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0.多少1.例如给定字符串“PAT ...
- ovs加dpdk出现EAL No free hugepages reported in hugepages-1048576kB
问题 打开ovs的日志: cat /etc/local/var/log/openvswitch/ovs-vswichd.log 其中一条显示: 2018-07-30T02:12:05.443Z|000 ...
- uboot 移植 要点
1.第一 首先要 学会 shell 语法 比如 变量的 概念 变量的使用 ,if 语法 ,以及简单 IF 语法(与 或预算),以及 while for 循环 等等语法,才能看得懂 uboot ...
- C++获取毫秒级时间戳
#include<chrono> auto timeNow = chrono::duration_cast<chrono::milliseconds>(chrono::sy ...
- 【OC底层】OC对象本质,如 isa, super-class
Objective-C的本质 1.我们编写的Objective-C,底层现实都是C/C++,代码生成步骤如下: 2.在OC中的所有面向对象的实现,都是基于C/C++的数据结构实现的 3.将Obje ...
- Java多线程入门知识点梳理
前言 在多核时代,高并发时代,对系统并行处理能力有很高要求.多线程就是这个时代最好的产物.通过使用多线程可以增强系统并行处理能力,提高CPU资源的有效利用:从而提高系统的处理能力.常见应用场景如:多窗 ...