【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了
#include <cstdio>
#include <vector>
#include <cstring>
#define R register
#define Inf 1000000000
#define MAXN 50000
using namespace std;
inline int read()
{
R int sum=;
R char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct Seg_Tree
{
Seg_Tree *ch[];
int l,r,size;
void pushup()
{
size=ch[]->size+ch[]->size;
}
}*null,*root[MAXN+];
typedef vector<Seg_Tree*> S;
char s[];
int a[MAXN+];
inline Seg_Tree *New(int l,int r)
{
Seg_Tree *p=new Seg_Tree;
p->l=l,p->r=r,p->size=;
p->ch[]=p->ch[]=null;
return p;
}
int n,m;
void ins(Seg_Tree *p,int key)
{
if(p->l==p->r)
{
p->size++;
return;
}
if(key<=((p->l+p->r)>>))
{
if(p->ch[]==null)p->ch[]=New(p->l,((p->l+p->r)>>));
ins(p->ch[],key);
}
else
{
if(p->ch[]==null)p->ch[]=New(((p->l+p->r)>>)+,p->r);
ins(p->ch[],key);
}
p->pushup();
}
inline void Ins(int pos,int key)
{
while(pos<=n)
{
if(root[pos]==null)root[pos]=New(,Inf);
ins(root[pos],key);
pos+=pos&(-pos);
}
}
void del(Seg_Tree *&p,int key)
{
if(p->l==p->r)
{
p->size--;
if(p->size==){ delete p; p=null; }
return;
}
if(key<=((p->l+p->r)>>))del(p->ch[],key);
else del(p->ch[],key);
p->pushup();
if(p->size==){ delete p; p=null; }
}
inline void Del(int pos,int key)
{
while(pos<=n)
{
del(root[pos],key);
pos+=pos&(-pos);
}
}
inline void Init()
{
null=New(,),n=read(),m=read();
null->ch[]=null->ch[]=null;
for(R int i=;i<=n;i++)root[i]=null;
for(R int i=;i<=n;i++)
a[i]=read(),Ins(i,a[i]);
}
inline S Catch(int pos)
{
S v;v.clear();
while(pos)
{
v.push_back(root[pos]);
pos-=pos&(-pos);
}
return v;
}
inline S get_ch0(S v)
{
for(R int i=;i<v.size();++i)v[i]=v[i]->ch[];
return v;
}
inline S get_ch1(S v)
{
for(R int i=;i<v.size();++i)v[i]=v[i]->ch[];
return v;
}
int query(S v1,S v2,int k,int z,int y)
{
if(z==y)return z;
R int sum=;
for(int i=;i<v2.size();i++)sum+=v2[i]->ch[]->size;
for(int i=;i<v1.size();i++)sum-=v1[i]->ch[]->size;
if(sum>=k) return query(get_ch0(v1),get_ch0(v2),k,z,(z+y)>>);
else return query(get_ch1(v1),get_ch1(v2),k-sum,((z+y)>>)+,y);
}
inline void Work()
{
R int x,y,z;
while(m--)
{
scanf("%s",s);
if(s[]=='C')
{
x=read(),y=read();
Del(x,a[x]),Ins(x,y);
a[x]=y;
continue;
}
else
{
x=read(),y=read(),z=read();
printf("%d\n",query(Catch(x-),Catch(y),z,,Inf));
}
}
}
void CL(Seg_Tree *p)
{
if(p==null)return;
CL(p->ch[]);
CL(p->ch[]);
delete p;
}
inline void Clear()
{
for(int i=;i<=n;i++)CL(root[i]),root[i]=NULL;
delete null;null=NULL;
}
int main()
{
freopen("dynrank.in","r",stdin);
freopen("dynrank.out","w",stdout);
R int T=read();
while(T--)
{
Init();
Work();
Clear();
}
}
【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树的更多相关文章
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- P3157 [CQOI2011]动态逆序对(树状数组套线段树)
P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...
- bzoj 1901 Dynamic Rankings (树状数组套线段树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- BZOJ3295 动态逆序对(树状数组套线段树)
[Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6058 Solved: 2117[Submit][Status][D ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
随机推荐
- 百度收录检测并主动推送API(实时 mip推送通用)
简要描述: 百度收录检测并主动推送API(实时) 请求URL: api.bigjiji.com/baiduCheck_123456 调用方式: img标签 参数: 参数名 必选 类型 说明 site ...
- 嵌入式C语言查表法
转自:https://blog.csdn.net/morixinguan/article/details/51799668 作者:Engineer-Bruce_Yang 就像下面的这个表 之前写 ...
- 使用virtual安装Windows系列操作系统总结
最近在安装Windows操作系统的过程中,发现总是报错,无法安装成功,后来经过不断地摸索,发现根本的问题在于镜像,所以在以后的大文件传输下载后,一定要校验其MD5值是否与源文件一致,需要的朋友可以联系 ...
- Make命令完全详解教程
Make命令完全详解教程 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用m ...
- (数据科学学习手札10)系统聚类实战(基于R)
上一篇我们较为系统地介绍了Python与R在系统聚类上的方法和不同,明白人都能看出来用R进行系统聚类比Python要方便不少,但是光介绍方法是没用的,要经过实战来强化学习的过程,本文就基于R对2016 ...
- I两种冒泡算法
两种冒泡算法: 第一个循环,I 定位当前坐标,第二个循环 把 I 之后的每个数都与 I 比较(比 I 小的都去坐标I),第二个循环之后 坐标 I 为数组里最小的数值. 效率比较高的冒泡算法: stat ...
- 部署:阿里云ECS部署Docker CE
1 部署阿里云ECS,选择CentOS操作系统,并启动实例: 2 部署Docker CE: a.检查centos版本: $ cat /etc/redhat-release CentOS Linux r ...
- eclipse 关闭validating
1.起因 validating XXX 总是非常的浪费时间,有时候还会造成程序卡死 2.解决 windows - Perferences - Validation build 全部去掉
- Python 3基础教程24-读取csv文件
本文来介绍用Python读取csv文件.什么是csv(Comma-Separated Values),也叫逗号分割值,如果你安装了excel,默认会用excel打开csv文件. 1. 我们先制作一个c ...
- 《python核心编程第二版》第5章习题
5-1 整形 讲讲 Python 普通整型和长整型的区别 答:普通整型 32位,长整数类型能表达的 数值仅仅与你的机器支持的(虚拟)内存大小有关 5-2 运算符(a) 写一个函数,计算并返回两个数的乘 ...