https://codeforces.com/contest/1143/problem/E

题意

p为n的一个排列,给出有m个数字的数组a,q次询问,每次询问a数组区间[l,r]中是否存在子序列为p的循环排列

题解

  • 预处理出值x在排列中的上一个值_p[x]
  • 从左向右扫一遍a数组,维护值x最后出现的地方\(pre[x]\),和每个位置i在排列顺序下前j个数在数组中的位置\(par[i][j]\)(倍增),然后能处理出每个位置i在排列顺序下前n-1个数的位置\(v[i]\)
  • 线段树维护v数组的区间最大值,查询区间v[l,r]>=l即存在

代码

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int n,m,q,p[MAXN],par[MAXN][25],_p[MAXN],a[MAXN],v[MAXN],mx[MAXN<<2],pre[MAXN],l,r;
void build(int o,int l,int r){
if(l==r){mx[o]=v[l];return;}
int mid=(l+r)/2;
build(o<<1,l,mid);build(o<<1|1,mid+1,r);
mx[o]=max(mx[o<<1],mx[o<<1|1]);
}
int qy(int o,int l,int r,int L,int R){
if(L<=l&&r<=R)return mx[o];
int mid=(l+r)/2;
int ans=0;
if(L<=mid)ans=max(ans,qy(o<<1,l,mid,L,R));
if(R>mid)ans=max(ans,qy(o<<1|1,mid+1,r,L,R));
return ans;
}
int main(){
cin>>n>>m>>q;
for(int i=0;i<n;i++)scanf("%d",&p[i]);
for(int i=1;i<=m;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++)_p[p[i]]=p[(i-1+n)%n];
for(int i=1;i<=m;i++){
int x=pre[_p[a[i]]];
par[i][0]=x;for(int j=1;j<=20;j++)par[i][j]=par[par[i][j-1]][j-1];
int d=n-1,u=i;
for(int j=20;j>=0;j--)if(d>>j&1)u=par[u][j];
v[i]=u;
pre[a[i]]=i;
}
build(1,1,m);
while(q--){
scanf("%d%d",&l,&r);
if(qy(1,1,m,l,r)>=l)printf("1");
else printf("0");
}
}

Codeforces Round #549 (Div. 2) E 倍增处理按排列顺序的上一个位置的更多相关文章

  1. Codeforces Round #549 (Div. 1)

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

  2. [题解] Codeforces Round #549 (Div. 2) B. Nirvana

    Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...

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

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

  4. Codeforces Round #549 (Div. 1) 题解

    link 前几天补完了某一场很早以前的div1,突然想来更博客,于是就有了这篇文章 A The Beatles 显然若起点和第一次到达的位置距离为 d ,那么经过的不同站点数为 $\frac{nk}{ ...

  5. Codeforces Round #549 (Div. 2) Solution

    传送门 A.The Doors 看懂题目就会写的题 给一个 $01$ 序列,找到最早的位置使得 $0$ 或 $1$ 已经全部出现 #include<iostream> #include&l ...

  6. Codeforces Round #381 (Div. 2) 复习倍增//

    刷了这套题  感触良多 我想 感觉上的差一点就是差很多吧 . 每次都差一点  就是差很多了... 不能气馁..要更加努力去填补那一点点.  老天不是在造物弄人,而是希望你用更好的自己去迎接自己. A. ...

  7. [ Codeforces Round #549 (Div. 2)][D. The Beatles][exgcd]

    https://codeforces.com/contest/1143/problem/D D. The Beatles time limit per test 1 second memory lim ...

  8. Codeforces Round #549 (Div. 2) F 数形结合 + 凸包(新坑)

    https://codeforces.com/contest/1143/problem/F 题意 有n条形如\(y=x^2+bx+c\)的抛物线,问有多少条抛物线上方没有其他抛物线的交点 题解 \(y ...

  9. Codeforces Round #549 (Div. 2) D 数学

    https://codeforces.com/contest/1143/problem/D 题意 有nk个城市,第1,k+1,2k+1,...,(n-1)k+1城市有餐厅,你每次能走l距离,a为起始位 ...

随机推荐

  1. Unity开发实战探讨-资源的加载释放最佳策略简要心得

    Unity开发实战探讨-资源的加载释放最佳策略简要心得 看过我另外一篇关于Unity资源释放随笔<Unity开发实战探讨-资源的加载释放最佳策略>如果觉得略微复杂,那么下面是一些比较简要的 ...

  2. POJ 3041 Asteroids(二分图最大匹配)

    ###题目链接### 题目大意: 给你 N 和 K ,在一个 N * N 个图上有 K 个 小行星.有一个可以横着切或竖着切的武器,问最少切多少次,所有行星都会被毁灭. 分析: 将 1~n 行数加入左 ...

  3. 十二、Spring之IOC容器初始化

    Spring之IOC容器初始化 前言 在前面我们分析了最底层的IOC容器BeanFactory,接着简单分析了高级形态的容器ApplicationContext,在ApplicationContext ...

  4. java函数式编程的形式

    java中没有真正的函数变量: 一.所有的函数(拉姆达)表达式,都被解释为functional interface @FunctionalInterface interface GreetingSer ...

  5. 专栏《Elasticsearch 7.x从入门到精通》的相关源代码

    新版Elasticsearch 7.3 和 Spring Boot 2.1.7 集成演示项目       第一个项目:演示Elasticsearch 6.4.3 和Spring Boot 2.1.7集 ...

  6. 关于如何提高缓存命中率(redis)

    一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...

  7. 10道Python常见面试题

    1.MySQL索引种类 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 2.索引在什么情况下遵循最左前缀的规则? 最左前缀原理的一部分,索引index1:(a,b,c),只会走a ...

  8. maven工程运行前准备

    近一年来,我学习了很多java及数据库前沿技术,如Spring框架,SpringMVC框架,Mybatis框架,Redis,Dubbo,Maven等. 以及一些Linux命令和在Linux环境下的工程 ...

  9. Linux CentOS 下安装.net core sdk

    注册Microsoft密钥 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm ...

  10. i春秋CTF-“百度杯”CTF比赛 九月场 XSS平台

    “百度杯“CTF比赛 九月场 ###XSS平台   看了别人的wp才知道这里需要变数组引起报错然后百度信息收集,这一步在实战中我觉得是很有作用的,get到.       这里取百度rtiny,看别人w ...