外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个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. thinkphp5阿里大于短信接口

    function autumn_sendsms($tel,$stype){ $pd_go=true; if($tel==''){ $msg='手机号不能为空'; $pd_go=false; } if( ...

  2. WHERE条件中or与union引起的全表扫描的问题

    说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解 ...

  3. 谭浩强C语言第四版第九章课后习题7--9题(建立,输出,删除,插入链表处理)

    #include<stdio.h> #include<stdlib.h> #define N sizeof(link) typedef struct stu { struct ...

  4. POJ3687 反向拓扑排序

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16032   Accepted: 4713 D ...

  5. Xshell启动时显示丢失MSVCP110.dll解决方法

    成功安装xshell之后,在运行时却弹出“无法启动此程序,因为计算机中丢失MSVCP110.dll.尝试重新安装该程序以解决此问题”,很多人按照提示重装了还是出现同样的问题,本集教程将具体讲解如何处理 ...

  6. 在WPF中创建可换肤的用户界面

    原文:在WPF中创建可换肤的用户界面 在WPF中创建可换肤的用户界面.                                                                  ...

  7. sqoop 的使用 -20160410

    1  导入导出数据库   1)列出mysql数据库中的所有数据库命令  #  sqoop list-databases --connect jdbc:mysql://localhost:3306/ - ...

  8. 深度学习之卷积神经网络CNN

    转自:https://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连 ...

  9. Django笔记 —— 基础部分总结

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  10. 使用PSSH批量操作Linux服务器

    简介 服务器多了,有一个问题就是如何批量快速操作多台服务器,在网上搜到了PSSH工具,试用了一下发现挺好用,推荐给大家. pssh是一个python编写的可以在多台服务器上执行命令的轻量级管理工具,同 ...