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,内 ...
随机推荐
- Kali-linux破解LM Hashes密码
LM(LAN Manager)Hash是Windows操作系统最早使用的密码哈希算法之一.在Windows 2000.XP.Vista和Windows 7中使用了更先进的NTLMv2之前,这是唯一可用 ...
- Bootstrap--模仿官网写一个页面
本文参考Bootstrap官方文档写了简单页面来熟悉Bootstrap的栅格系统.常用CSS样.Javascript插件和部分组件. 以下html代码可以直接复制本地运行: BootstrapPage ...
- HDU 1007 Quoit Design(经典最近点对问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
- 如何弹出WiFi提示列表。
如果你的程序中用到了WiFi,想在没有有效WiFi的时候出现如图所示的提示该怎么做? 其实很简单, 只需要在Info.plist中添加如下Key/Value UIRequiresPersistentW ...
- 用 S5PV210 学习 Linux (一) 刷机(一)
简介: 习惯了 用 keil 或者 IAR 一键下载 (烧写) 代码,S5PV210 貌似就不能这么简单用 仿真器的 方式 下载代码了,因此 学习 S5PV210 的第一步就是 学习怎么下载代码,下 ...
- .gitignore设置不生效
.gitignore git中,如果想要让git忽略某些文件,或不想push到远程库,不让其受版本的控制.可以使用git提供的.gitignore文件进行配置.像这样: 一般情况下,在文件还未修改前, ...
- Web | Webpack快速上手
概述 Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 一般我们在开发中都是使用终端去进行安装,使用npm,关于npm ...
- MVC与MVVM之间在IOS中的区别
作为一个iOS开发者,我不止一次听到我的一些开发者朋友跟我说我写的iOS代码看起来好舒服,很整洁,为什么咱们iOS开发的相当一大部分应用软件都给人以美的享受,究竟是什么使得iOS上的应用可以如此漂亮? ...
- SQL语句group by 与order by 执行顺序引发的一场“内斗”
直入主题!看看下面这SQL会不会报错?如果报错应该是什么错误! --说明:黑色字体都是列SELECT application_id, index_num, num, amount FROM `cred ...
- 浅谈 Virtual DOM 的那些事
背景 我们都知道频繁的dom给我们带来的代价是昂贵的,例如我们有时候需要去更新Table 的部分数据,必须去重新重绘表格,这代价实在是太大了,相比于频繁的手动去操作dom而带来性能问题,vdom很好的 ...