BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树
题目描述
输入
输出
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
样例输入
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
样例输出
6
带修改主席树经典题,树状数组上每个点建一棵主席树,存树状数组上这个点包含的序列中点的信息,修改看成删除和插入,每次操作跳lowbit。
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
int n,m;
char ch[2];
int x,y,z;
int cnt;
int tot;
int num;
int ls[8000010];
int rs[8000010];
int sum[8000010];
int root[100010];
int s[100010];
int t[100010];
int a[100010];
int updata(int pre,int l,int r,int k)
{
int rt=++cnt;
if(l==r)
{
sum[rt]=sum[pre]+1;
return rt;
}
ls[rt]=ls[pre];
rs[rt]=rs[pre];
sum[rt]=sum[pre]+1;
int mid=(l+r)>>1;
if(k<=mid)
{
ls[rt]=updata(ls[pre],l,mid,k);
}
else
{
rs[rt]=updata(rs[pre],mid+1,r,k);
}
return rt;
}
int downdata(int pre,int l,int r,int k)
{
int rt=++cnt;
if(l==r)
{
sum[rt]=sum[pre]-1;
return rt;
}
ls[rt]=ls[pre];
rs[rt]=rs[pre];
sum[rt]=sum[pre]-1;
int mid=(l+r)>>1;
if(k<=mid)
{
ls[rt]=downdata(ls[pre],l,mid,k);
}
else
{
rs[rt]=downdata(rs[pre],mid+1,r,k);
}
return rt;
}
void add(int v,int x)
{
for(int i=x;i<=n;i+=i&-i)
{
root[i]=updata(root[i],0,1e9,v);
}
}
void del(int v,int x)
{
for(int i=x;i<=n;i+=i&-i)
{
root[i]=downdata(root[i],0,1e9,v);
}
}
int query(int l,int r,int k)
{
if(l==r)
{
return l;
}
int ans=0;
int res=0;
for(int i=1;i<=num;i++)
{
res+=sum[ls[s[i]]];
}
for(int i=1;i<=tot;i++)
{
ans+=sum[ls[t[i]]];
}
int mid=(l+r)>>1;
if(ans-res>=k)
{
for(int i=1;i<=num;i++)
{
s[i]=ls[s[i]];
}
for(int i=1;i<=tot;i++)
{
t[i]=ls[t[i]];
}
return query(l,mid,k);
}
else
{
for(int i=1;i<=num;i++)
{
s[i]=rs[s[i]];
}
for(int i=1;i<=tot;i++)
{
t[i]=rs[t[i]];
}
return query(mid+1,r,k-(ans-res));
}
}
void ask(int l,int r,int x)
{
num=0;
tot=0;
for(int i=l;i;i-=i&-i)
{
s[++num]=root[i];
}
for(int i=r;i;i-=i&-i)
{
t[++tot]=root[i];
}
printf("%d\n",query(0,1e9,x));
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(a[i],i);
}
for(int i=1;i<=m;i++)
{
scanf("%s",ch);
if(ch[0]=='Q')
{
scanf("%d%d%d",&x,&y,&z);
ask(x-1,y,z);
}
else
{
scanf("%d%d",&x,&y);
del(a[x],x);
a[x]=y;
add(a[x],x);
}
}
}
BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树的更多相关文章
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- LUOGU P2617 Dynamic Rankings(树状数组套主席树)
传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- [COGS257]动态排名系统 树状数组套主席树
257. 动态排名系统 时间限制:5 s 内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】
题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...
- Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...
随机推荐
- Android学习之基础知识五—编写聊天界面
第一步:在app/build.grandle添加RecyclerView依赖库 第二步:在activity_main.xml文件中编写主界面:聊天.发送框.发送按钮三个部分 第三步:编写Message ...
- kubernetes 持久化部署lamp类型网站
1.构建mariadb的镜像 cat Dockerfile FROM mariadb:latest ADD twocloud_kk.sql /docker-entrypoint-initdb.d #C ...
- Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值
有时,我们需要往一张表插入一条记录,同时返回主键ID值. 假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值 这里有几种情况需要注意: 1)如果建表语句含有主键ID的触发器,通过 ...
- React-理解Redux
Redux是什么? 是专于状态管理的库 专于状态管理和react解耦 单一状态,单项数据流 核心概念 store state action reducer Redux工作流 react 要改变stor ...
- sqlserver 发送http请求
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures' ...
- 记一次网页超时登录的Bug
前几天,在做全公司的员工测评工作,在一个页面弹出导入页面,并导入所有评价记录,然后关闭掉这个导入页面,最后返回当前页面,返回时刷新当前页面. 在返回的时候,就出现了“页面超时登录”同时返回登录首页的问 ...
- spring boot配置统一异常处理
基于@ControllerAdvice的统一异常处理 >.这里ServerException是我自定义的异常,和普通Exception分开处理 >.这里的RequestResult是我自定 ...
- CF 958E2. Guard Duty (medium)
这道题是昨天linkfqy dalao上课讲的一道题 当时他讲的时候就想到了一种玄学的搞法,然后不敢相信自己切掉了 没想到后来CHJ dalao也想到了这种算法,然后发现是对的 后来10min就切掉了 ...
- Jlink使用技巧之虚拟串口功能
前言 串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink ...
- item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 5解释了比起显式指定类型,使用auto来 ...