CF1142E/1143B Lynyrd Skynyrd

  • 开始读错题了,以为是连续的一段,敲完后才发现是 \(subsequence\) ...
  • 考虑对于 \(a\) 中的每个 \(a_i\) 找到它在排列 \(p\) 中的下一个元素的最左位置 \(j\) ,从 \(i\) 到 \(j\) 连一条边,这样就形成了一个森林.
  • 然后 \(dfs\) 遍历一下,用一个栈来存储当前在路径中的点,若当前节点为 \(u\) ,而路径长 \(\geq n\) ,说明路径中从 \(u\) 开始的 \(n\) 个位置构成了一个 \(cyclic\ shift\) .
  • 这样就可以处理出以点 \(i\) 为第一个元素,能找到的 \(cyclic\ shift\) 最后一个元素的最左位置 \(minr_i\).对这个东西取一下后缀 \(\min\) ,则它表示后缀 \(i\sim n\) 中能找到的 \(cyclic\ shift\) 最后一个元素的最左位置 .
  • 对于每个询问 \((l,r)\) ,只需判断是否有 \(r \leq minr_l​\) 即可.
  • 时间复杂度 \(O(n+Q)\).
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define mp make_pair
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int MAXN=2e5+10;
int n,m,Q;
int a[MAXN],b[MAXN],nxp[MAXN];
int pos[MAXN];
queue<char> buf;
int cnt=0,head[MAXN],to[MAXN],nx[MAXN];
inline void addedge(int u,int v)
{
++cnt;
to[cnt]=v;
nx[cnt]=head[u];
head[u]=cnt;
}
int vis[MAXN];
int minr[MAXN];
int stk[MAXN],tp=0;
void dfs(int u)
{
vis[u]=1;
stk[++tp]=u;
if(tp>=n)
minr[u]=min(minr[u],stk[tp-n+1]);
for(int i=head[u];i;i=nx[i])
{
int v=to[i];
if(!vis[v])
dfs(v);
}
--tp;
}
int main()
{
n=read(),m=read(),Q=read();
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1;i<=m;++i)
b[i]=read();
a[0]=a[n],a[n+1]=a[1];
for(int i=1;i<=n;++i)
nxp[a[i]]=a[i+1];
for(int i=m;i>=1;--i)
{
pos[b[i]]=i;
int pre=nxp[b[i]];
if(pos[pre])
addedge(pos[pre],i);
}
memset(minr,0x7f,sizeof minr);
for(int i=m;i>=1;--i)
{
if(!vis[i])
dfs(i);
minr[i]=min(minr[i],minr[i+1]);
}
while(Q--)
{
int l=read(),r=read();
if(minr[l]<=r)
buf.push('1');
else
buf.push('0');
}
while(!buf.empty())
{
putchar(buf.front());
buf.pop();
}
return 0;
}

CF1142E/1143B Lynyrd Skynyrd的更多相关文章

  1. 【CF1142B】Lynyrd Skynyrd

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

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

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

  3. 『题解』Codeforces1142B Lynyrd Skynyrd

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

  4. B. Lynyrd Skynyrd

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

  5. Codeforces 1142B Lynyrd Skynyrd

    ---恢复内容开始--- 题意:给你一个排列p和数组a,有t组询问,每次询问一个区间的子序列中是否有p的一个循环排列. 思路:以p = [3, 1, 2]举例, 我们扫描数组b,假设当前数字是1,那么 ...

  6. CF1142B Lynyrd Skynyrd

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

  7. 「CF1142B」Lynyrd Skynyrd

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

  8. Codeforces Round #549 (Div. 1)

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

  9. Codeforces Round #549 (Div. 2) 训练实录 (5/6)

    The Doors +0 找出输入的01数列里,0或者1先出完的的下标. Nirvana +3 输入n,求1到n的数字,哪个数逐位相乘的积最大,输出最大积. 思路是按位比较,从低到高,依次把小位换成全 ...

随机推荐

  1. android调用照相机拍照获取照片并做简单剪裁

    引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html 效果: 客服端代码:   package com.cn.lx ...

  2. 【Golang 接口自动化00】为什么要用Golang做自动化?

    为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后,因为没有开发那么多的时间和项目来实践,怕步此前学习Java缺少练习遗忘殆尽的后尘,决定利用工作之余的时间把此前用Python的写的 ...

  3. Oracle 千万级别数据查询优化

    说明:平时很少接触到大数据分页,今天有兴趣在数据库插入1000万条数据进行测试,经过查询相关资料得到如下说明:笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示,便考虑用rownum ...

  4. m_Orchestrate learning system---三十三、公共变量多弄成全局变量

    m_Orchestrate learning system---三十三.公共变量多弄成全局变量 一.总结 一句话总结:比如班级id,小组id,这样省事,而且减少数据库的访问,加快访问速度,而且节约代码 ...

  5. Yii 语言设置 中文提示信息

    1.  在main.php配置文件中加入 'language'=>'zh_cn', 注: 在URL中追加参数lang=zh_cn即可实现中文 2.  在Controller方法中添加 publi ...

  6. 自适应界面开发总结——WPF客户端开发

    1.由于界面大小是变化的,所以必须有一个稳定不变的参考界面(即在一个标准的界面尺寸下进行WPF界面开发,比如:发票查验V3.0的美工设计尺寸——1024*740):   PS:在WPF的用户控件Xam ...

  7. 3-1 LVS-NAT集群

    ---- (整理)By 小甘丶 什么是集群: 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.(Cluster就是一组计算机,它们作为一个整体向用户提供一 ...

  8. 安装完DevExpress14.2.5,如何破解它呢?

    DevExpress是一个界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.DevExpress开发的控件有很强的实力,不仅功能丰富,应用简单,而且界面华丽,更可方便订制,方便开发人员开 ...

  9. C#winform窗体如何通过windowApi的FindWindow函数获取窗体句柄

    在同一个程序里,传统方式是通过this来设置当前窗体的最大化.最小化等操作, 那么怎样通过窗体句柄来设置窗体的最大化.最小化呢? 1.界面布局 通过this设置窗体最大化: name:btnWindo ...

  10. React教程-组件

    在React中创建一个组件非常简单(React组件有2种,一个非状态组件,一个有状态组件) 首先我们来看看ES6里面如何写构造函数 class App{ constructor(){ } event( ...