[一本通学习笔记] 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 ...
随机推荐
- Django如何连接mysql
1.设置django的mysql驱动为pymysql 因为django默认的是使用MySqlDb连接mysql数据库,但是由于该模块不支持python3.4以上版本,所以使用pymysql模块 在项目 ...
- Android开发第一天---AndroidStudio的安装和第一个安卓开发
今天已经是开始学习Android的第二天,我居然才把AndroidStudio开发环境安装并配置好,我只能说“我太难了”,下了好几个版本,终于找到了一个合适的,得出一个结论外国的东西是真的不太好用啊, ...
- 用sort实现对struct的排序
用sort 排序 struct +++ //method 1 struct node{ int k,s; }p[5005]; bool cmp1(node x,node y){ return x.s& ...
- 基于WEB的车票预订信息系统设计
注册登录界面 用户输入网址以后,用自己的手机号作为账号,然后输入自己想设置的密码注册一个号,然后点击注册,即注册登录.如图5.1所示: 图5.1 车票预订信息系统注册登录界面 5.2 车票查询界面 ...
- PHP0004:PHP基础3
php写在 标签里
- 剑指offer-面试题27-二叉树的镜像-二叉树
/* 题目:输入一个二叉树,输出该函数的镜像. */ /* 思路: 基础条件:树为空,或只有一个节点. 其它:递归交换二叉树的左右子树. */ void Mirror(TreeNode *pRoot) ...
- cookies欺骗-bugkuctf
解题思路: 打开链接是一串没有意义的字符串,查看源码没有发现什么,然后查看url,发现 filename的值是base64编码的,拿去解码 发现是一个文件,那么我们这里应该可以读取当前目录下的本地文件 ...
- Codeforces Round #616 Coffee Varieties
题意 不太容易讲清,看英文吧 codeforces 做法 先从简单的看起 将块以\(\frac{k}{2}\)个元素为界,然后类似线段树一样递归下去,每次一层的左子树跟右子树的块相互暴力比较 \[\b ...
- win10系统中按顺序安装jdk、tomcat
一.首先安装jdk1.8,重点在于配置环境 安装步骤见另一篇软件安装中的博客 配置环境 1.首先要打开系统环境变量配置的页面.具体操作是:桌面上找到“此电脑”,然后右键 “属性”. 然后打开高级系统配 ...
- 1级搭建类106-Oracle 19c 单实例 FS(华为云)公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...