『题解』Codeforces1142B Lynyrd Skynyrd
Portal
Portal1: Codeforces
Portal2: Luogu
Description
Recently Lynyrd and Skynyrd went to a shop where Lynyrd bought a permutation \(p\) of length \(n\), and Skynyrd bought an array \(a\) of length \(m\), consisting of integers from \(1\) to \(n\).
Lynyrd and Skynyrd became bored, so they asked you \(q\) queries, each of which has the following form: "does the subsegment of \(a\) from the \(l\)-th to the \(r\)-th positions, inclusive, have a subsequence that is a cyclic shift of \(p\)?" Please answer the queries.
A permutation of length \(n\) is a sequence of \(n\) integers such that each integer from \(1\) to \(n\) appears exactly once in it.
A cyclic shift of a permutation \((p_1, p_2, \ldots, p_n)\) is a permutation \((p_i, p_{i + 1}, \ldots, p_{n}, p_1, p_2, \ldots, p_{i - 1})\) for some \(i\) from \(1\) to \(n\). For example, a permutation \((2, 1, 3)\) has three distinct cyclic shifts: \((2, 1, 3)\), \((1, 3, 2)\), \((3, 2, 1)\).
A subsequence of a subsegment of array \(a\) from the \(l\)-th to the \(r\)-th positions, inclusive, is a sequence \(a_{i_1}, a_{i_2}, \ldots, a_{i_k}\) for some \(i_1, i_2, \ldots, i_k\) such that \(l \leq i_1 < i_2 < \ldots < i_k \leq r\).
Input
The first line contains three integers \(n\), \(m\), \(q\) (\(1 \le n, m, q \le 2 \cdot 10^5\)) — the length of the permutation \(p\), the length of the array \(a\) and the number of queries.
The next line contains \(n\) integers from \(1\) to \(n\), where the \(i\)-th of them is the \(i\)-th element of the permutation. Each integer from \(1\) to \(n\) appears exactly once.
The next line contains \(m\) integers from \(1\) to \(n\), the \(i\)-th of them is the \(i\)-th element of the array \(a\).
The next \(q\) lines describe queries. The \(i\)-th of these lines contains two integers \(l_i\) and \(r_i\) (\(1 \le l_i \le r_i \le m\)), meaning that the \(i\)-th query is about the subsegment of the array from the \(l_i\)-th to the \(r_i\)-th positions, inclusive.
Output
Print a single string of length \(q\), consisting of \(0\) and \(1\), the digit on the \(i\)-th positions should be \(1\), if the subsegment of array \(a\) from the \(l_i\)-th to the \(r_i\)-th positions, inclusive, contains a subsequence that is a cyclic shift of \(p\), and \(0\) otherwise.
Sample Input1
3 6 3
2 1 3
1 2 3 1 2 3
1 5
2 6
3 5
Sample Output1
110
Sample Input2
2 4 3
2 1
1 1 2 2
1 2
2 3
3 4
Sample Output2
010
Hint
In the first example the segment from the \(1\)-st to the \(5\)-th positions is \(1, 2, 3, 1, 2\). There is a subsequence \(1, 3, 2\) that is a cyclic shift of the permutation. The subsegment from the \(2\)-nd to the \(6\)-th positions also contains a subsequence \(2, 1, 3\) that is equal to the permutation. The subsegment from the \(3\)-rd to the \(5\)-th positions is \(3, 1, 2\), there is only one subsequence of length \(3\) (\(3, 1, 2\)), but it is not a cyclic shift of the permutation.
In the second example the possible cyclic shifts are \(1, 2\) and \(2, 1\). The subsegment from the \(1\)-st to the \(2\)-nd positions is \(1, 1\), its subsequences are not cyclic shifts of the permutation. The subsegment from the \(2\)-nd to the \(3\)-rd positions is \(1, 2\), it coincides with the permutation. The subsegment from the \(3\) to the \(4\) positions is \(2, 2\), its subsequences are not cyclic shifts of the permutation.
Solution
我们可以先预处理出\(a_i\)在\(p\)序列中的前一个数为\(\mathrm{last}_i\)。如果它能构成一个合法的循环序列,就代表它能够向前位移\(n - 1\)次\(\mathrm{last}\)。所以我们可以用倍增来解决。我们取一个最大的合法循环序列的头表示为\(\mathrm{b}_i\),那么最后的条件就是:
\]
满足就输出\(1\),否则输出\(0\)。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1000005, MAXM = 30;
int n, m, q, l, r, a[MAXN], b[MAXN], p[MAXN], last[MAXN], pos[MAXN], st[MAXN][MAXM];
inline int calc_step(int x) {
int s = 0;
for (int i = 25; i >= 0; i--)
if (s + (1 << i) < n) {
x = st[x][i];
s += 1 << i;
}
return x;
}
inline int query(int l, int r) {
int x = (int)log2(r - l + 1);
return max(st[l][x], st[r - (1 << x) + 1][x]);//询问ST表
}
int main() {
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
pos[p[i]] = i;
}
for (int i = 1; i <= m; i++) {
scanf("%d", &a[i]);
if (pos[a[i]] == 1) st[i][0] = last[p[n]]; else st[i][0] = last[p[pos[a[i]] - 1]];
last[a[i]] = i;
}
for (int j = 1; j <= 25; j++)
for (int i = 1; i <= m; i++)
st[i][j] = st[st[i][j - 1]][j - 1];
for (int i = 1; i <= m; i++)
b[i] = calc_step(i);
memset(st, 0, sizeof(st));
for (int i = 1; i <= m; i++)
st[i][0] = b[i];
for (int j = 1; j <= (int)log2(m); j++)
for (int i = 1; i <= m - (1 << j) + 1; i++)
st[i][j] = max(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);//ST表
for (int i = 1; i <= q; i++) {
scanf("%d%d", &l, &r);
if (query(l, r) >= l) printf("1"); else printf("0");
}
return 0;
}
『题解』Codeforces1142B Lynyrd Skynyrd的更多相关文章
- 『题解』洛谷P1063 能量项链
原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...
- 【题解】CF1142B Lynyrd Skynyrd(倍增)
[题解]CF1142B Lynyrd Skynyrd(倍增) 调了一个小时原来是读入读反了.... 求子段是否存在一个排列的子序列的套路是把给定排列看做置换,然后让给定的序列乘上这个置换,问题就转化为 ...
- 『题解』Codeforces1142A The Beatles
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently a Golden Circle of Beetlovers ...
- 『题解』洛谷P1993 小K的农场
更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...
- 『题解』洛谷P2296 寻找道路
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...
- 『题解』洛谷P1351 联合权值
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...
- 『题解』Codeforces656E Out of Controls
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description You are given a complete undirected gr ...
- 『题解』洛谷P2170 选学霸
更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...
- 『题解』洛谷P1083 借教室
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...
随机推荐
- 纯C语言写的按键驱动,将按键逻辑与按键处理事件分离~
button drive 杰杰自己写的一个按键驱动,支持单双击.连按.长按:采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键,按键事件与回调处理函数链接映射,周期检查按键. 源码地址:h ...
- python入门经典_好资源送不停
Python入门经典(2K超清_送书) https://study.163.com/course/courseMain.htm?courseId=1006183019&share=2& ...
- 你也可以写个服务器 - C# Socket学习2
前言 这里说的服务器是Web服务器,是类似IIS.Tomcat之类的,用来响应浏览器请求的服务. Socket模拟浏览器的Url Get请求 首先浏览器的请求是HTTP协议.我们上一篇说过,HTTP是 ...
- Linux系统取证实践
目录 0x00 本课概述 0x01 用到命令 0x00 本课概述 本课时学习Linux系统下取证分析命令. 0x01 用到命令 1.top命令 2.ps命令 3.kill命令 4.linux系统日 ...
- PHP array_udiff_uassoc
1.函数的参数:返回数组的差集.用定义的函数比较键值和值. 2.函数的参数: @params array $array @params array $array1 ... @params callab ...
- PHP array_reverse
1.函数的作用:将数组中的元素顺序反转 2.函数的参数: @params array $array 需要反转顺序的数组 @params $preversed_key 数值索引是否保持不变,非数值索引 ...
- Twitter-Snowflake:自增ID算法
简介 Twitter 早期用 MySQL 存储数据,随着用户的增长,单一的 MySQL 实例没法承受海量的数据,后来团队就研究如何产生完美的自增ID,以满足两个基本的要求: 每秒能生成几十万条 ID ...
- 深入理解 Java 中的 final 关键字
final 是Java 中重要关键字之一,可以应用于类.方法以及变量上.这篇文章中将讲解什么是 final 关键字?将变量.方法和类声明为 final 代表了什么?使用 final 的好处是什么? f ...
- Python小工具:利用ffmpy3库3秒钟将视频转换为音频
作者 | pk 哥 来源公众号 | Python知识圈(ID:PythonCircle) 最近,有读者微信上私聊我,想让我写一篇视频批量转换成音频的文章,我答应了,周末宅家里把这个小工具做出来了. 这 ...
- leetcode 刷500道题,笔试/面试稳过吗?谈一谈这些年来算法的学习
想要学习算法.应付笔试或者应付面试手撕算法题,相信大部分人都会去刷 Leetcode,有读者问?如果我在 leetcode 坚持刷它个 500 道题,以后笔试/面试稳吗? 这里我说下我的个人看法,我认 ...