CF1142E/1143B Lynyrd Skynyrd
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的更多相关文章
- 【CF1142B】Lynyrd Skynyrd
[CF1142B]Lynyrd Skynyrd 题面 洛谷 题解 假设区间\([l,r]\)内有一个循环位移,那么这个循环位移一定有一个最后的点,而这个点在循环位移中再往前移\(n-1\)个位置也一定 ...
- 【题解】CF1142B Lynyrd Skynyrd(倍增)
[题解]CF1142B Lynyrd Skynyrd(倍增) 调了一个小时原来是读入读反了.... 求子段是否存在一个排列的子序列的套路是把给定排列看做置换,然后让给定的序列乘上这个置换,问题就转化为 ...
- 『题解』Codeforces1142B Lynyrd Skynyrd
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently Lynyrd and Skynyrd went to a ...
- B. Lynyrd Skynyrd
传送门: 题意:给出 n,m,q 然后给出模板串,从1-n数字只出现一次,然后给出长度为m的要询问的串. q组询问:每组询问输出 ‘1’或者‘0’ 每组询问 一对x,y 问在x到y中有没有模板串 ...
- Codeforces 1142B Lynyrd Skynyrd
---恢复内容开始--- 题意:给你一个排列p和数组a,有t组询问,每次询问一个区间的子序列中是否有p的一个循环排列. 思路:以p = [3, 1, 2]举例, 我们扫描数组b,假设当前数字是1,那么 ...
- CF1142B Lynyrd Skynyrd
题目 有两种做法: 第一种是\(O(nlog\ n)\)的. 我们预处理两个数组: \(pre_i\)表示\(p\)中\(i\)前面的那个数是\(pre_i\). \(lst_i\)表示\(a\)中\ ...
- 「CF1142B」Lynyrd Skynyrd
传送门 Luogu 解题思路 发现一个性质: 对于排列的任何一个循环位移,排列中的同一个数的前驱肯定是不变的. 而且,如果一个排列的循环位移是某一个区间的子序列,那么这个循环位移的结尾的 \(n-1\ ...
- Codeforces Round #549 (Div. 1)
今天试图用typora写题解 真开心 参考 你会发现有很多都是参考的..zblzbl Codeforces Round #549 (Div. 1) 最近脑子不行啦 需要cf来缓解一下 A. The B ...
- Codeforces Round #549 (Div. 2) 训练实录 (5/6)
The Doors +0 找出输入的01数列里,0或者1先出完的的下标. Nirvana +3 输入n,求1到n的数字,哪个数逐位相乘的积最大,输出最大积. 思路是按位比较,从低到高,依次把小位换成全 ...
随机推荐
- 《A_Pancers》第二次作业 基于Android系统的音乐播放系统项目开题报告
小组名 N A B C D 总分 Just_Do_IT! 8 8 9 9 8 42 Miracle-House 8 8 7 8 8 39 ymm3 9 8 8 8 8 41 Spring_Four ...
- C#一套简单的单例系统
单例基类 public class CSingletonBase<TYPE> { public static TYPE Singleton { get { return m_singlet ...
- windows下python检查文件是否被其它文件打开
windows下python检查文件是否被其它文件打开.md 有时候我们需要能够判断一个文件是否正在被其它文件访问,几乎不可避免的要调用操作系统接口 from ctypes import cdll i ...
- JavaScript 和 React,React用了大量语法糖,让JS编写更方便。
https://reactjs.org/docs/higher-order-components.htmlhttps://codepen.io/gaearon/pen/WooRWa?editors=0 ...
- memcached客户端连接建立过程笔记
memcached在启动过程初始化server_sockets时,根据启动参数决定系统是进行tcp监听还是udp监听,这里暂时只关注tcp的情况. server_socket在初始化时会向系统申请监听 ...
- android--------面试题收集
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题 ...
- mac 安装phpunit
大部分内容来自:https://blog.csdn.net/aishangyutian12/article/details/64124536 感谢创作,感谢分享 单元测试的重要性就不说了,postma ...
- Ubuntu解压缩zip,tar,tar.gz,tar.bz2文件命令
tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName .gz解压1:gunzip FileName.gz解压2:gzip -d FileN ...
- 普通Region中动态设置poplist的值跟着当前区域的某些值动态变化
//控件设置 ID Catergory1 Item Style messageChoice Picklist View Definition Cux.oracle.apps.po.poplist.se ...
- spring中@Scope作用域的注解
@Scope简单点说就是用来指定bean的作用域 官方解释是:scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对 ...