【题解】CF1142B Lynyrd Skynyrd(倍增)

调了一个小时原来是读入读反了....

求子段是否存在一个排列的子序列的套路是把给定排列看做置换,然后让给定的序列乘上这个置换,问题就转化为最长上升序列。这是因为一个数的前驱后继是唯一的。

这一题稍微改变了一下,我们要求的是类似于\(4\quad 5\quad1\quad 2 \quad 3\)的子序列。就相当于给1添了个前驱n,给\(n\)添了个后继\(1\),本质还是一样的,仍然是一个数的前驱后继是唯一的。

原本1,m没有额外关系时,做法是定位所有\(1\)考虑一步步倍增后继到\(m\)看位置在哪。现在1,m有关系了,就每个点都可以成为起点。现在就是维护一个数据求区间\(\min\)了,随你怎么写,可以询问离线\(O(n)\)但是我直接st表了

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(!isdigit(c))f|=c==45,c=getchar();
while(isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=2e5+5;
int p[maxn],data[maxn];
int st[19][maxn],Pair[maxn],Min[19][maxn];
int lg[maxn];
int last[maxn];
int n,m,T;
const int inf=0x3f3f3f3f;
int main(){
/*
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
*/
m=qr(); n=qr(); T=qr();
for(int t=2;t<=n;++t) lg[t]=lg[t>>1]+1;
for(int t=1;t<=m;++t) p[qr()]=t;
for(int t=1;t<=n;++t) data[t]=p[qr()];
//for(int t=1;t<=n;++t) cerr<<data[t]<<' ';
//cerr<<('\n');
for(int t=n;t;--t){
if(last[data[t]+1]) st[0][t]=last[data[t]+1];
if(data[t]==m&&last[1]) st[0][t]=last[1];
last[data[t]]=t;
}
//for(int t=1;t<=n;++t) cerr<<st[0][t]<<' ';
//cerr<<endl;
for(int t=1;t<=lg[m];++t)
for(int i=1;i<=n;++i)
st[t][i]=st[t-1][st[t-1][i]];
memset(Min,0x3f,sizeof Min);
for(int t=1;t<=n;++t){
int k=t;
for(int i=0;i<=lg[m-1];++i)
if(((m-1)>>i&1))
k=st[i][k];
if(k) Min[0][t]=k;
}
for(int t=1;t<=lg[n];++t)
for(int i=1;i<=n;++i)
Min[t][i]=min(Min[t-1][i]?Min[t-1][i]:inf,Min[t-1][i+(1<<t>>1)]?Min[t-1][i+(1<<t>>1)]:inf);
//for(int t=1;t<=n;++t) cerr<<Min[1][t]<<' ';
//cerr<<endl;
while(T--){
int l=qr(),r=qr();
//cerr<<"min="<<Min[lg[r-l+1]][l]<<' '<<Min[lg[r-l+1]][r-(1<<lg[r-l+1])+1] <<endl;
if(min(Min[lg[r-l+1]][l],Min[lg[r-l+1]][r-(1<<lg[r-l+1])+1])<=r) putchar(49);
else putchar(48);
}
putchar(10);
return 0;
}

【题解】CF1142B Lynyrd Skynyrd(倍增)的更多相关文章

  1. CF1142B Lynyrd Skynyrd

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

  2. 【CF1142B】Lynyrd Skynyrd

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

  3. CF1142E/1143B Lynyrd Skynyrd

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

  4. 【题解】HDU Homework(倍增)

    [题解]HDU Homework(倍增) 矩阵题一定要多多检查一下是否行列反了... 一百个递推项一定要存101个 说多了都是泪啊 一下午就做了这一道题因为实在是太菜了太久没写这种矩阵的题目... 设 ...

  5. 『题解』Codeforces1142B Lynyrd Skynyrd

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

  6. 「CF1142B」Lynyrd Skynyrd

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

  7. B. Lynyrd Skynyrd

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

  8. CodeForces #549 Div.2 ELynyrd Skynyrd 倍增算法

    题目 这道题目实际上可以用动态规划来做. 对于每个区间,我们从右边边界,往左边走,如果能走n-1次,那说明以右边边界为起点存在一个题目中说的子链. 利用倍增算法,实际上倍增也是动态规划.f[i][j] ...

  9. Codeforces 1142B Lynyrd Skynyrd

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

随机推荐

  1. Python基础:21包装

    “包装”在Python 编程中经常会被提到的一个术语.意思是对一个已存在的对象进行包装,可以是对一个已存在的对象,增加,删除,或者修改功能. 可以包装任何类型(type)作为一个类(class)的核心 ...

  2. webstorm破解教程

    1.下载地址 官网:https://www.jetbrains.com/webstorm/ 下载好之后按照提示安装即可,这里就不再多说了.下面直接说说如何使用补丁破解. 2.使用补丁破解 (http: ...

  3. hdu 1156 && poj 2464 Brownie Points II (BIT)

    2464 -- Brownie Points II Problem - 1156 hdu分类线段树的题.题意是,给出一堆点的位置,stan和ollie玩游戏,stan通过其中一个点画垂线,ollie通 ...

  4. Fish Shell使用心得

    Fish的官网宣传语是 Finally, a command line shell for the 90s. 翻译过来就是 Fish shell 是一个为90后准备的 shell. 有人说:" ...

  5. windows 关闭端口被占用脚本

    cmd 关闭进程java taskkill /F /IM java.exe taskkill /f /im java.exe 如何用dat批处理文件关闭某端口对应程序-Windows自动化命令 如何用 ...

  6. 以P2P网贷为例互联网金融产品如何利用大数据做风控?

    以P2P网贷为例互联网金融产品如何利用大数据做风控?   销售环节 了解客户申请意愿和申请信息的真实性:适用于信贷员模式. 风控关键点 亲见申请人,亲见申请人证件,亲见申请人签字,亲见申请人单位. 审 ...

  7. git的安装与命令行基本的使用

    1.https://git-scm.com/ 点击这个网址进入git的官方网站 2,.进去里面会有提示,64位于32位的,根据自己的电脑安装 3 下载完了过后就直接安装,一般会安装在c盘里面 ,进入安 ...

  8. Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

    1. 前言想验证你对 jvm 配的一些调优参数(比如 Xms.Xmx 等)有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数.有没有死锁?应用出现 java.lang.OutOfM ...

  9. H3C 基本的局域网间路由

  10. P1057 迷宫路径

    题目描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...