[luoguP2617] Dynamic Ranking(树状数组 套 主席树 + 离散化)
BZOJ上是权限题,洛谷赞啊。
求区间 K 大数很简单。
但是如果修改某个数的话,那么就得把这个数及后面所建的主席树都更新一遍 nlogn,显然不行。
所以可以在外面套一个树状数组来优化,树状数组的每一个节点都表示某个区间的主席树。
所以可以通过树状数组来求前缀和主席树。
具体实现看代码。
——代码
#include <cstdio>
#include <iostream>
#include <algorithm> const int MAXN = ;
int n, m, tot, cnt, size, t1, t2;
int a[MAXN], b[MAXN], x[MAXN], y[MAXN], z[MAXN], q1[MAXN], q2[MAXN], root[MAXN], ls[MAXN * ], rs[MAXN * ], sum[MAXN * ];
char s[MAXN]; inline int read()
{
int x = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar());
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x;
} inline void insert(int &now, int l, int r, int x, int v)
{
if(!now) now = ++cnt;
sum[now] += v;
if(l == r) return;
int mid = (l + r) >> ;
if(x <= mid) insert(ls[now], l, mid, x, v);
else insert(rs[now], mid + , r, x, v);
} inline int query(int l, int r, int x)
{
if(l == r) return l;
int i, mid = (l + r) >> , ans = ;
for(i = ; i <= t1; i++) ans -= sum[ls[q1[i]]];
for(i = ; i <= t2; i++) ans += sum[ls[q2[i]]];
if(x <= ans)
{
for(i = ; i <= t1; i++) q1[i] = ls[q1[i]];
for(i = ; i <= t2; i++) q2[i] = ls[q2[i]];
return query(l, mid, x);
}
else
{
for(i = ; i <= t1; i++) q1[i] = rs[q1[i]];
for(i = ; i <= t2; i++) q2[i] = rs[q2[i]];
return query(mid + , r, x - ans);
}
} int main()
{
int i, j, l, r;
n = read();
m = read();
for(i = ; i <= n; i++) a[i] = read(), b[++tot] = a[i];
for(i = ; i <= m; i++)
{
for(s[i] = getchar(); s[i] != 'Q' && s[i] != 'C'; s[i] = getchar());
if(s[i] == 'C') x[i] = read(), z[i] = read(), b[++tot] = z[i];
else x[i] = read(), y[i] = read(), z[i] = read();
} std::sort(b + , b + tot + );
size = std::unique(b + , b + tot + ) - (b + );
for(i = ; i <= n; i++) a[i] = std::lower_bound(b + , b + size + , a[i]) - b;
for(i = ; i <= m; i++)
if(s[i] == 'C')
z[i] = std::lower_bound(b + , b + size + , z[i]) - b; for(i = ; i <= n; i++)
for(j = i; j <= size; j += j & -j)
insert(root[j], , size, a[i], ); for(i = ; i <= m; i++)
if(s[i] == 'Q')
{
t1 = t2 = ;
for(j = x[i] - ; j; j -= j & -j) q1[++t1] = root[j];
for(j = y[i]; j; j -= j & -j) q2[++t2] = root[j];
printf("%d\n", b[query(, size, z[i])]);
}
else
{
for(j = x[i]; j <= size; j += j & -j) insert(root[j], , size, a[x[i]], -);
a[x[i]] = z[i];
for(j = x[i]; j <= size; j += j & -j) insert(root[j], , size, z[i], );
}
return ;
}
[luoguP2617] Dynamic Ranking(树状数组 套 主席树 + 离散化)的更多相关文章
- 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】P2617Dynamic Ranking(树状数组套主席树)
题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...
- 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> ...
随机推荐
- electron打包整理
最近在折腾把项目打包成桌面应用程序,发现一个工具electron,可以讲项目打包成一个跨平台的应用程序,很方便,来学习一下. 1.先安装electron.electron-packager,安装方法可 ...
- Snort里如何将读取的包记录存到二进制tcpdump文件下(图文详解)
不多说,直接上干货! 如果网络速度很快,或者想使日志更加紧凑以便以后的分析,那么应该使用二进制的日志文件格式.如tcpdump格式或者pcap格式. 这里,我们不需指定本地网络了,因为所以的东西都被 ...
- [书目20140902]实战Windows Azure——微软云计算平台技术详解 --徐子岩
目录第1章 云计算技术简介 1.1 云计算所要解决的问题 1.2 云计算平台的分类 1.3 微软云计算平台Windows Azure 1.3.1 高可用性 ...
- Android开发学习--RecycleView入门
该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView.GridView 通过设置它提供的不同LayoutManager,ItemDecoration , It ...
- 对于JS == 运算的一些理解
声明:本文是摘自一篇文章,放在这只为做为一个笔记能更好学习. 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性” ...
- scala如何在任意方法中打印当前线程栈信息(StackTrace)
1.以wordcount为例 package org.apache.spark.examples import org.apache.spark.{SparkConf, SparkContext} / ...
- Boost库编译安装
一.Boost库介绍 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其 ...
- http升级https改造方案
一.解决方案 1.httpClient请求https版蓝鲸接口 (1).原理 https与http最大的区别在于SSL加密传输协议的使用.在自己写的JAVA HttpClient程序,想手动验证证书, ...
- Matlab基础之单元数组和结构数组
Matlab基础之单元数组和结构数组 前言: 单元数组和结构数组是一种新的数据类型,能将不同类型.不同维数的数组组合在一起,从而方便对不同的数据类型方便管理和维护. 如上图所示的2*2矩阵中,分别存储 ...
- 迅为八核cortex a53开发板android/linux/Ubuntu系统
详情请点击了解:http://www.topeetobard.com 店铺:https://arm-board.taobao.com 核心板: 提供1G和2G内存版本,全机器焊接,杜绝手工,批量无忧. ...