外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个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】动态排名系统 树状数组套线段树的更多相关文章

  1. BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树

    题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...

  2. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  3. 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[ ...

  4. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  5. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  6. bzoj 1901 Dynamic Rankings (树状数组套线段树)

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  7. BZOJ3295 动态逆序对(树状数组套线段树)

    [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6058  Solved: 2117[Submit][Status][D ...

  8. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  9. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

随机推荐

  1. Hadoop(4)--Hbase

    Hadoop 其它组成角色介绍--Hbase 在apache的官方网站上,对于Hbase的定义是他是Hadoop的第一个分布式.可扩展的大数据存储的数据库,他的目标是将非常大的表托管到一个集群中进行相 ...

  2. vue---day02

    1. 全局组件的注册 - 创建根实例的时候,data可以是object,也可以是函数 - 创建组件的时候,data必须是函数 1.1 创建 Vue.component('global-componen ...

  3. python2.7练习小例子(十八)

    19):题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数.      #!/usr/bin/python # -*- ...

  4. Android开发——View绘制过程源码解析(一)

    )UNSPECIFIED:表示View可以设置成任意的大小,没有任何限制.这种情况比较少见. 2. MeasureSpec的生成过程 2.1 顶级View的MeasureSpec // desired ...

  5. 在Linux中安装和配置OpenVPN Server的最简便方法!

    本文介绍了如何在基于RPM和DEB的系统中安装和配置OpenVPN服务器.我们在本文中将使用一个名为openvpn-install的脚本,它使整个OpenVPN服务器的安装和配置过程实现了自动化.该脚 ...

  6. Hadoop入门案列,初学者Coder

    1.WordCount Job类: package com.simope.mr.wcFor; import org.apache.hadoop.conf.Configuration; import o ...

  7. php 使用GD库压缩图片,添加文字图片水印

    先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...

  8. Python 3基础教程28-内置函数

    本文介绍Python中的内置函数,Python中有很多内置的,功能强大的函数,可以帮我们解决很多问题,有些方法,根本不需要你去再次编写实现函数,你直接调用就可以.在这之前,需要介绍下,如何在windo ...

  9. 孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4

    孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  10. Spark集群管理器介绍

    Spark可以运行在各种集群管理器上,并通过集群管理器访问集群中的其他机器.Spark主要有三种集群管理器,如果只是想让spark运行起来,可以采用spark自带的独立集群管理器,采用独立部署的模式: ...