其实很简单,把之前随机数据的解法中维护块内数据的数据结构换成约束 RMQ,这样子复杂度 严格 单点修改 \(O(\sqrt n)\),区间查询 \(O(1)\),线性空间。

唯一的问题是常数太大了,有 \(4\) 倍常数。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000;
const int MAXM = 20;
const int warma = 1000;
int a[1000001];
int INPUT[MAXN];
int cnt;
struct RMQ {
int mx;
int N, A[MAXN];
int blockSize;
int S[MAXN][MAXM], Pow[MAXM], Log[MAXN];
int Belong[MAXN], Pos[MAXN];
int Pre[MAXN], Sub[MAXN];
int F[MAXN];
void buildST() {
int cur = 0, id = 1;
Pos[0] = -1;
for (int i = 1; i <= N; ++i) {
S[id][0] = std::max(S[id][0], A[i]);
Belong[i] = id;
if (Belong[i - 1] != Belong[i])
Pos[i] = 0;
else
Pos[i] = Pos[i - 1] + 1;
if (++cur == blockSize) {
cur = 0;
++id;
}
}
if (N % blockSize == 0) --id;
Pow[0] = 1;
for (int i = 1; i < MAXM; ++i) Pow[i] = Pow[i - 1] * 2;
for (int i = 2; i <= id; ++i) Log[i] = Log[i / 2] + 1;
for (int i = 1; i <= Log[id]; ++i) {
for (int j = 1; j + Pow[i] - 1 <= id; ++j) {
S[j][i] = std::max(S[j][i - 1], S[j + Pow[i - 1]][i - 1]);
}
}
} void buildSubPre() {
for (int i = 1; i <= N; ++i) {
if (Belong[i] != Belong[i - 1])
Pre[i] = A[i];
else
Pre[i] = std::max(Pre[i - 1], A[i]);
}
for (int i = N; i >= 1; --i) {
if (Belong[i] != Belong[i + 1])
Sub[i] = A[i];
else
Sub[i] = std::max(Sub[i + 1], A[i]);
}
} void buildBlock() {
static int S[MAXN], top;
for (int i = 1; i <= N; ++i) {
if (Belong[i] != Belong[i - 1])
top = 0;
else
F[i] = F[i - 1];
while (top > 0 && A[S[top]] <= A[i]) F[i] &= ~(1 << Pos[S[top--]]);
S[++top] = i;
F[i] |= (1 << Pos[i]);
}
} void init() {
for(int i=1;i<=1001;i++){
A[i]=Log[i]=Belong[i]=Pos[i]=Pre[i]=Sub[i]=F[i]=0;
}
for(int i=1;i<=20;i++){
Pow[i]=0;
}
for(int i=1;i<=101;i++){
for(int j=1;j<=11;j++){
S[i][j]=0;
}
}
mx=0;
for (int i = 1; i <= N; ++i) A[i]=INPUT[i],mx=max(mx,A[i]);
blockSize = max( (int)(log2(N) * 1.5),1);
buildST();
buildSubPre();
buildBlock();
} int queryMax(int l, int r) {
int bl = Belong[l], br = Belong[r];
if (bl != br) {
int ans1 = 0;
if (br - bl > 1) {
int p = Log[br - bl - 1];
ans1 = std::max(S[bl + 1][p], S[br - Pow[p]][p]);
}
int ans2 = std::max(Sub[l], Pre[r]);
return std::max(ans1, ans2);
} else {
return A[l + __builtin_ctz(F[r] >> Pos[l])];
}
}
} R[MAXN];
void init(){
for(int i=1;i<=cnt;i++){
INPUT[i]=R[i].mx;
}
R[cnt+1].N=cnt;
R[cnt+1].init();
}
int query(int l,int r){
int bl=l/warma+1;
l%=warma;
if(l==0){
bl--;
l+=warma;
}
int br=r/warma+1;
r%=warma;
if(r==0){
br--;
r+=warma;
}
if(bl==br){
return R[bl].queryMax(l,r);
}
else if(bl+1==br){
return max(R[bl].queryMax(l,R[bl].N),R[br].queryMax(1,r));
}
else{
return max(max(R[bl].queryMax(l,R[bl].N),R[br].queryMax(1,r)),R[cnt+1].queryMax(bl+1,br-1));
}
}
void add(int pos,int val){
a[pos]+=val;
int bpos=pos/warma+1;
if(pos%warma==0){
bpos--;
}
int len=0;
for(int i=(bpos-1)*warma+1;i<=min(n,bpos*warma);i++){
len++;
INPUT[i-(bpos-1)*warma]=a[i];
}
R[bpos].N=len;
R[bpos].init();
init();
}
int n,m;
int last=1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(i%warma==0){
R[++cnt].N=(i-last+1);
for(int j=last;j<=i;j++){
INPUT[j-last+1]=a[j];
}
R[cnt].init();
last=i+1;
}
}
if(last<=n){
R[++cnt].N=(n-last+1);
for(int j=last;j<=n;j++){
INPUT[j-last+1]=a[j];
}
R[cnt].init();
last=n+1;
}
init();
while(m--){
int l,r;
cin>>l>>r;
cout<<query(l,r)<<'\n';
}
/*
scanf("%d%d", &R.N, &M);
R.init();
for (int i = 0, l, r; i < M; ++i) {
scanf("%d%d", &l, &r);
printf("%d\n", R.queryMax(l, r));
}
*/
return 0;
}

严格根号带修 RMQ的更多相关文章

  1. Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)

    Codeforces 题目传送门 & 洛谷题目传送门 震惊!我竟然独立切掉了这道 *3100 的题! 虽然此题难度的确虚高,感觉真实评分也就 2800~2900 罢.但感觉还是挺有成就感的( ...

  2. 莫队初探(不带修/例题极少)By cellur925

    因为今天考到莫队裸题了嘤嘤嘤...而我这样的蒟蒻肯定不会这样的高端算法啊QAQ.于是暴力水了40分qwq. 正如上文所说,我实在太菜了,于是学习莫队也只是学习了最简单的不带修普通莫队,如果我能苟到省选 ...

  3. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  4. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  5. 主席树套树状数组——带修区间第k大zoj2112

    主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...

  6. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  7. BZOJ2120 数颜色 莫队 带修莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...

  8. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  9. UVA 12345 Dynamic len(带修莫队)

    Dynamic len [题目链接]Dynamic len [题目类型]带修莫队 &题解: 莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字. 之后循环离线的时候,先暴力时 ...

  10. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

随机推荐

  1. DNS(4) -- dns功能实现-配置正向解析和反向解析以及DNS递归查询示例

    目录 1 DNS配置示例 1.1 DNS解析类型 1.2 配置正向解析 1.3 配置反向解析 1.4 DNS递归查询 1.4.1 开启递归查询 1.4.2 关闭递归查询 1 DNS配置示例 1.1 D ...

  2. Python函数与模块的精髓与高级特性

    本文分享自华为云社区<Python函数与模块的精髓与高级特性>,作者:柠檬味拥抱. Python 是一种功能强大的编程语言,拥有丰富的函数和模块,使得开发者能够轻松地构建复杂的应用程序.本 ...

  3. yum install --downloadonly

    yum install --downloadonly --downloaddir=[directory] [package] https://www.cnblogs.com/wangbaobao/p/ ...

  4. 基于Python的性能分析

    1.什么是性能分析 字面意思就是对程序的性能,从用户角度出发就是运行的速度,占用的内存. 通过对以上情况的分析,来决定程序的哪部份能被优化.提高程序的速度以及内存的使用效率. 首先我们要弄清楚造成时间 ...

  5. Linux安装ElastSearch

    Linux安装ES 准备好Linux系统,软件安装前需要对当前系统做一些优化配置 系统配置修改 一.内存优化 在/etc/sysctl.conf添加如下内容: fs.file-max=655360 系 ...

  6. CCL 2024 Task7 双任务冠军

    近期参加NLP领域CCL2024评测,现将赛题背景和实现方法分享,推理文本纠错领域的发展. 1.背景信息 随着教育的发展和网络的普及,作文评价的规模越来越大,人工评改作文的成本和效率成为一大难题.为了 ...

  7. rocketmq 搭建配置

    broker组1: # NameServer地址 namesrvAddr=192.168.1.100: 9876;192.168.1.101: 9876 # 集群名称 brokerClusterNam ...

  8. RocketMQ事务消息源码解析

    RocketMQ提供了事务消息的功能,采用2PC(两阶段协议)+补偿机制(事务回查)的分布式事务功能,通过这种方式能达到分布式事务的最终一致. 一. 概述 半事务消息:指的是发送至broker但是还没 ...

  9. 详解Spring循环依赖

    一. 什么是循环依赖 循环依赖,就是两个或则两个以上的bean互相依赖对方,最终形成闭环.比如"A对象依赖B对象,而B对象也依赖A对象",或者"A对象依赖B对象,B对象依 ...

  10. Java类加载过程&&静态代码块的初始化过程

    问题的引入 还是老规矩,先说说自己遇到的问题. 最近看到了一个比较有意思的Java程序,初次看到这段程序执行的结果还是挺让我意外的,话不多说先上程序,大家也可以揣摩一下(大神自行略过......) c ...