『题解』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 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...
随机推荐
- 微信小程序模板消息
1 先去微信公众平台,选择现有模板,会有一个模板编号,模板中没有的关键词,可以申请新增. 微信公众平台直达:https://mp.weixin.qq.com 模板消息对应文档直达:https://de ...
- [ZJOI2006]物流运输trans
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- 为什么不同命名空间的docker容器可以相互通信?
一.什么是容器网络栈 所谓容器能看见的"网络栈",被隔离在自己的Network Namespace当中 1.网卡(network interface) 2.回环设备(loopbac ...
- badboy录制脚本
第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...
- STM32串口IAP分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通 ...
- Debian更新源加安装Metespolit&&Cobalt Strike
首先更新下源 修改/etc/apt/sources.list文件 再apt-get update deb http://mirrors..com/debian/ stretch main non-fr ...
- PHP 利用闭包偷窥马对人类的想法
<?php /** * reference:http://www.php.net/manual/en/reflectionmethod.getclosure.php * Learn this a ...
- 记一次EF Core DBContext在Action委托中GC异常的问题.
今天在开发过程中发现.在SaveChanges的时候偶尔会抛出异常:Cannot access a disposed object. A common cause of this error is d ...
- Https工作流程图
- Arduino学习笔记⑤ 模拟IO实验
1.前言 还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化.在Arduino中,常用0~5v的电压来表示模拟信号. 1.1 模拟输入功能 ...