---恢复内容开始---

题意:给你一个排列p和数组a,有t组询问,每次询问一个区间的子序列中是否有p的一个循环排列。

思路:以p = [3, 1, 2]举例, 我们扫描数组b,假设当前数字是1,那么我们找前面离现在最近的3的位置,然后连一条边。为什么只连最近的呢?比如[3,3,1,2]这种情况,1只需要和第二个3连就行了,因为连第一个3的这种情况已经被连第二个3的这种情况包含了。那么对于每个点,我们可以找到通过连的边走n - 1次所到的点,所有包含这个区间的询问区间都有一个合法的循环排列。但是直接暴力找n - 1次到的点会被卡成O(n^2)的,我们可以用倍增优化这个过程。之后,对于每个点,我们只需记录在它前面的点中满足走n  - 1次的点中最大的那一个就行了,因为这样相当于对于每个点,尽力压缩合法的区间。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 200010;
int f[maxn][20], pre[maxn], a[maxn], b[maxn], last[maxn], p[maxn], res[maxn];
int n, m, T, t;
int solve(int x) {
int now = n - 1, ans = x;
for (int i = t; i >= 0; i--) {
if(p[i] <= now) {
ans = f[ans][i];
now -= p[i];
}
}
return ans;
}
int main() {
int l, r;
scanf("%d%d%d", &n, &m, &T);
t = (int)(log(n) / log(2)) + 1;
p[0] = 1;
for (int i = 1; i <= t;i++) {
p[i] = p[i - 1] * 2;
}
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 2; i <= n; i++) {
pre[a[i]] = a[i - 1];
}
pre[a[1]] = a[n];
for (int i = 1; i <= m; i++) {
scanf("%d", &b[i]);
f[i][0] = last[pre[b[i]]];
for (int j = 1; j <= t; j++) {
f[i][j] = f[f[i][j - 1]][j - 1];
}
last[b[i]] = i;
}
int pos;
for (int i = 1; i <= m; i++) {
pos = solve(i);
res[i] = max(res[i - 1], pos);
}
while(T--) {
scanf("%d%d", &l, &r);
if(res[r] >= l) printf("1");
else printf("0");
}
}

  

---恢复内容结束---

Codeforces 1142B Lynyrd Skynyrd的更多相关文章

  1. CF1142E/1143B Lynyrd Skynyrd

    CF1142E/1143B Lynyrd Skynyrd 开始读错题了,以为是连续的一段,敲完后才发现是 \(subsequence\) ... 考虑对于 \(a\) 中的每个 \(a_i\) 找到它 ...

  2. 【CF1142B】Lynyrd Skynyrd

    [CF1142B]Lynyrd Skynyrd 题面 洛谷 题解 假设区间\([l,r]\)内有一个循环位移,那么这个循环位移一定有一个最后的点,而这个点在循环位移中再往前移\(n-1\)个位置也一定 ...

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

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

  4. 『题解』Codeforces1142B Lynyrd Skynyrd

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently Lynyrd and Skynyrd went to a ...

  5. B. Lynyrd Skynyrd

    传送门: 题意:给出 n,m,q 然后给出模板串,从1-n数字只出现一次,然后给出长度为m的要询问的串. q组询问:每组询问输出 ‘1’或者‘0’ 每组询问 一对x,y    问在x到y中有没有模板串 ...

  6. Codeforces 1142B(倍增)

    1.先预处理出在循环中某数前面的数是谁. 2.读入a数列时贪心选取最晚的父亲. 3.链上倍增预处理二进制祖先. 4.对于每个位置,预处理第n-1个祖先位置最早要从哪里开始,技巧上再顺手与前一位的最早位 ...

  7. CF1142B Lynyrd Skynyrd

    题目 有两种做法: 第一种是\(O(nlog\ n)\)的. 我们预处理两个数组: \(pre_i\)表示\(p\)中\(i\)前面的那个数是\(pre_i\). \(lst_i\)表示\(a\)中\ ...

  8. 「CF1142B」Lynyrd Skynyrd

    传送门 Luogu 解题思路 发现一个性质: 对于排列的任何一个循环位移,排列中的同一个数的前驱肯定是不变的. 而且,如果一个排列的循环位移是某一个区间的子序列,那么这个循环位移的结尾的 \(n-1\ ...

  9. Codeforces Round #549 (Div. 1)

    今天试图用typora写题解 真开心 参考 你会发现有很多都是参考的..zblzbl Codeforces Round #549 (Div. 1) 最近脑子不行啦 需要cf来缓解一下 A. The B ...

随机推荐

  1. c#线程中下载文件到本地

    额,太懒了 直接上示例代码... /// <summary> /// 下载文件到本地 2017-05-31 /// </summary> /// <param name= ...

  2. 去掉Arraylist集合中的重复元素

    package cn.collection; import java.util.ArrayList; import java.util.Iterator; import java.util.Scann ...

  3. hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

     题目链接 /* 模板题-------判断欧拉回路 欧拉路径,无向图 1判断是否为连通图, 2判断奇点的个数为0 */ #include <iostream> #include <c ...

  4. New Concept English three (57)

    28w/m 54errors I stopped to let the car cool off and to study the map. I had expected to be near my ...

  5. UVA - 1610 Party Games (字符串比较)

    给你n(n为偶数)个字符串,让你找出一个长度最短且字典序尽量小的字符串,使得一半的字符串小于等于该串,一半的字符串大于该串. 紫薯上说这道题有坑,但其实思路对了就没什么坑. 很明显,只要取夹在中间两个 ...

  6. HDU - 5307 :He is Flying (分治+FFT)(非正解)

    JRY wants to drag racing along a long road. There are nn sections on the road, the ii-th section has ...

  7. Shell脚本备份Mongodb数据库

    目录 环境还原 环境创建 编写shell脚本 准备文件 创建shell脚本 执行shell脚本 进阶版 感谢 诚邀访问我的个人博客:我在马路边 更好的阅读体验点击查看原文:Shell脚本备份Mongo ...

  8. mendeley 参考文献管理工具

    本文由Suzzz原创,发布于http://www.cnblogs.com/Suzzz/p/4044144.html,转载请保留此声明 目录 介绍 功能 运行截图 安装方法 创建 Desktop Ent ...

  9. centos下wget: command not found的解决方法

    今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装,这里是C ...

  10. wpf控件提示Value ‘’ can not convert

    我们在对控件的ErrorTemplate设置后,有时会出现Value '' can not convert. 为什么会出现呢? 原因:如果控件的输入值和null不能转换(比如控件要求的是int或flo ...