[一本通学习笔记] RMQ专题
傻傻地敲了好多遍ST表。
10119. 「一本通 4.2 例 1」数列区间最大值
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
struct st {
int a[N][21];
void build(int *src, int n) {
for (int i = 1; i <= n; i++) a[i][0] = src[i];
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= n - (1 << i) + 1; j++)
a[j][i] = max(a[j][i - 1], a[j + (1 << (i - 1))][i - 1]);
}
int query(int l, int r) {
int j = log2(r - l + 1);
return max(a[l][j], a[r - (1 << j) + 1][j]);
}
};
int n, m, a[N];
st s;
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
s.build(a, n);
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
cout << s.query(u, v) << endl;
}
}
10120. 「一本通 4.2 例 2」最敏捷的机器人
#include <bits/stdc++.h>
using namespace std;
struct Monoqueue {
deque<pair<int, int> > q;
void push(int val, int tim) {
while (q.size() && q.front().first >= val) q.pop_front();
q.push_front(make_pair(val, tim));
}
int get(int tim) {
while (q.size() && q.back().second < tim) q.pop_back();
return q.back().first;
}
};
Monoqueue a, b;
int n, k, t;
int main() {
ios::sync_with_stdio(false);
cin >> n >> k;
for (int i = 1; i < k; i++) {
cin >> t;
a.push(t, i + k - 1);
b.push(-t, i + k - 1);
}
for (int i = k; i <= n; i++) {
cin >> t;
a.push(t, i + k - 1);
b.push(-t, i + k - 1);
cout << -b.get(i) << " " << a.get(i) << endl;
}
}
10121. 「一本通 4.2 例 3」与众不同
#include <bits/stdc++.h>
using namespace std;
int n, m, a[3000005], L, R;
namespace Monoqueue {
int head = -1, tail = 0, q[2000005], buck[2000005], jmp[2000005];
void solve() {
for (int i = 1; i <= n; i++) {
q[++head] = a[i];
while (buck[a[i]]) buck[q[tail++]]--;
buck[a[i]]++;
jmp[i] = (head - tail + 1);
}
}
} // namespace Monoqueue
namespace ST {
int s[2000005][21];
void build(int n, int *src) {
for (int i = 1; i <= n; i++) s[i][0] = src[i];
for (int j = 1; j < 20; j++)
for (int i = 1; i <= n - (1 << j >> 1); i++) s[i][j] = max(s[i][j - 1], s[i + (1 << j >> 1)][j - 1]);
}
int query(int l, int r) {
int lg = log2(r - l + 1);
return max(s[l][lg], s[r - (1 << lg) + 1][lg]);
}
} // namespace ST
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i], a[i] += 1000000;
Monoqueue::solve();
ST::build(n, Monoqueue::jmp);
for (int i = 1; i <= m; i++) {
int l, r;
cin >> l >> r;
++l;
++r;
int L = 1, R = r - l + 2;
while (R > L) {
int M = (L + R) >> 1;
int x = ST::query(l + M - 1, r);
// cout<<L<<" "<<R<<" "<<M<<" "<<x<<endl;
if (x >= M)
L = M + 1;
else
R = M;
}
cout << L - 1 << endl;
}
}
10122. 「一本通 4.2 练习 1」天才的记忆
#include <bits/stdc++.h>
using namespace std;
int n, m, a[1000005][21];
void build() {
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= n - (1 << i >> 1) + 1; j++)
a[j][i] = max(a[j][i - 1], a[j + (1 << i >> 1)][i - 1]);
}
int query(int l, int r) {
int lg = log2(r - l + 1);
return max(a[l][lg], a[r - (1 << lg) + 1][lg]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i][0];
build();
cin >> m;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
cout << query(u, v) << endl;
}
}
10123. 「一本通 4.2 练习 2」Balanced Lineup
#include <bits/stdc++.h>
using namespace std;
int n, m, a[1000005][21], b[1000005][21], u, v;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i][0], b[i][0] = a[i][0];
for (int i = 1; i <= 20; i++)
for (int j = 1; j + (1 << i >> 1) - 1 <= n; j++)
a[j][i] = max(a[j][i - 1], a[j + (1 << i >> 1)][i - 1]),
b[j][i] = min(b[j][i - 1], b[j + (1 << i >> 1)][i - 1]);
for (int i = 1; i <= m; i++) {
cin >> u >> v;
int lg = log2(v - u + 1);
cout << max(a[u][lg], a[v - (1 << lg) + 1][lg]) - min(b[u][lg], b[v - (1 << lg) + 1][lg]) << endl;
}
}
[一本通学习笔记] RMQ专题的更多相关文章
- [一本通学习笔记] 最近公共祖先LCA
本节内容过于暴力没什么好说的.借着这个专题改掉写倍增的陋习,虽然写链剖代码长了点不过常数小还是很香. 10130. 「一本通 4.4 例 1」点的距离 #include <bits/stdc++ ...
- [一本通学习笔记] AC自动机
AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现 ...
- [一本通学习笔记] 字典树与 0-1 Trie
字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phon ...
- [一本通学习笔记] KMP算法
KMP算法 对于串s[1..n],我们定义fail[i]表示以串s[1..i]的最长公共真前后缀. 我们首先考虑对于模式串p,如何计算出它的fail数组.定义fail[0]=-1. 根据“真前后缀”的 ...
- jQuery学习笔记(一)jQuery选择器
目录 jQuery选择器的优点 基本选择器 层次选择器 过滤选择器 表单选择器 第一次写博客,希望自己能够长期坚持,以写博客的方式作为总结与复习. 最近一段时间开始学习jQuery,通过写一个jQue ...
- 图灵学院JAVA互联网架构师专题学习笔记
图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)
目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...
- KPROCESS IDT PEB Ldr 《寒江独钓》内核学习笔记(3)
继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构. 1. 相关阅读材料 <深入理解计算机系统(原书第2版)> 二. KPROCESS KPROCESS,也叫内核进 ...
- EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...
随机推荐
- [MongoDB]MongoDB的ObjectId组成
一.ObjectId的组成首先通过终端命令行,向mongodb的collection中插入一条不带“_id”的记录.然后,通过查询刚插入的数据,发现自动生成了一个objectId“5e4fa350b6 ...
- 解决vue-cli使用组件报错
今天使用vue-cli,明明写的没错,都是vue-cli自动生成的,编译时怎嘛就会报错呢? 报错信息如下: 浏览器端报错: Failed to compile. ./src/components/Hi ...
- 【Git】git使用 - 各种常用场景命令解决
(多看git中的各种帮助-h/--help,可能有你想要的命令) 1.分支的创建和切换 创建 >>>> git branch branchName 切换分支 >>& ...
- HAProxy 使用小记
PS:写在开头,虽然HAProxy优点很多,但是现在网上可参考的HAProxy文档真的少之又少,so,我把最近在项目中使用的心得整理下,供大家参考,如有侵权或错误之处,还请联系更正,谢谢! 好了,下面 ...
- JAVA输出流与输入流
输出流 编程入门的第一个程序,输出一串字符串 public class C { public static void main(String[] args) { System.out.println( ...
- H5_0024:对于事先无法确定css大小的情况,可以通过JS动态修改
$(function(){ function Heights(){ var WinH = $(window).height(); ...
- 嵊州D2T4 十七个中毒的英国人 poisoning
嵊州D2T4 十七个中毒的英国人 poisoning 利内罗女士准备来到意大利进行修行. 意大利由 n 个城市和 m 条道路构成,道路是双向的. 到达第 i 个城市时,她可以取得该城市的全部信仰,并获 ...
- Math Magic ZOJ - 3662
核心是要想到只枚举最小公倍数的因子 因为转移过程中一单添加了不是最小公倍数的因子,那么结果必然不合法,虽然最终答案是对的,但是这样的答案根本用不上,反而时间复杂度大大增加 #include<cs ...
- ASP.NET Identity系列教程-4【Identity高级技术】
https://www.cnblogs.com/r01cn/p/5194257.html 15 ASP.NET Identity高级技术 In this chapter, I finish my de ...
- Linux connect: Network is unreachable
在虚拟机中ping,发现网络不通: [root@node01 ~]# ping 114.114.114.114 connect: Network is unreachable 发生此问题时,环境如下: ...