更好的阅读体验

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\),那么最后的条件就是:

\[\max ^ {r} _ {i = l}{\mathrm{b}_i} \ge l
\]

满足就输出\(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的更多相关文章

  1. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  2. 【题解】CF1142B Lynyrd Skynyrd(倍增)

    [题解]CF1142B Lynyrd Skynyrd(倍增) 调了一个小时原来是读入读反了.... 求子段是否存在一个排列的子序列的套路是把给定排列看做置换,然后让给定的序列乘上这个置换,问题就转化为 ...

  3. 『题解』Codeforces1142A The Beatles

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently a Golden Circle of Beetlovers ...

  4. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  5. 『题解』洛谷P2296 寻找道路

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...

  6. 『题解』洛谷P1351 联合权值

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...

  7. 『题解』Codeforces656E Out of Controls

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description You are given a complete undirected gr ...

  8. 『题解』洛谷P2170 选学霸

    更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...

  9. 『题解』洛谷P1083 借教室

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

随机推荐

  1. Typesetting HDU - 6107

    Yellowstar is writing an article that contains N words and 1 picture, and the i-th word contains aia ...

  2. HashTable、Dictionary、ConcurrentDictionary三者区别

    转载自https://blog.csdn.net/yinghuolsx/article/details/72952857 1.HashTable HashTable表示键/值对的集合.在.NET Fr ...

  3. Linux之常用命令II

    一.VI编辑器 1) 概述 ◆  Visual Interface(可视化接口): ◆  类似Windows中的记事本,比记事本强大: ◆  VIM相对于VI做了哪些提升 -VIM支持多级撤销 -VI ...

  4. Python的字符串编码

    本文用实验详细地演示了Python2和Python3在字符串编码上的区别. 在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量.这些字符串的一个重要限制是它们无法完全地支持国际 ...

  5. App元素定位

    1.元素定位(采用Appium-desktop自带的工具) 1.1将初始化参数复制进去校验json格式正确且保存后,点击start session 初始化参数来源如下: # 定义启动设备需要的参数 d ...

  6. Python_文本的读写操作

    [需求] 1. 获取文本内容,提取内容中的可用信息,对信息进行清洗等一系列处理 2. 算法输出一些内容,保存到文本文件中,便于使用 [函数] 在Python中open()函数是用来打开文件的,包括文本 ...

  7. Chrome常见黑客插件及用法

    目录   0x00  Web Developer(网页开发者) 0x01 Firebug Lite for Google Chrome (Firebug精简版) 0x02 d3coder (decod ...

  8. [Luogu2458][SDOI2006]保安站岗

    题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...

  9. 01jmeter-beanshell常用代码段

    1.获取时间 import java.util.*; import java.text.SimpleDateFormat; String str1 = (new SimpleDateFormat(&q ...

  10. Redis学习四(运维指南).

    一.上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性. redis 的运行机器 CPU 不求核数多,但求主频高 ...