Codeforces Round #549 (Div. 2) E 倍增处理按排列顺序的上一个位置
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 倍增处理按排列顺序的上一个位置的更多相关文章
- Codeforces Round #549 (Div. 1)
		今天试图用typora写题解 真开心 参考 你会发现有很多都是参考的..zblzbl Codeforces Round #549 (Div. 1) 最近脑子不行啦 需要cf来缓解一下 A. The B ... 
- [题解] Codeforces Round #549 (Div. 2) B. Nirvana
		Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ... 
- Codeforces Round #549 (Div. 2) 训练实录 (5/6)
		The Doors +0 找出输入的01数列里,0或者1先出完的的下标. Nirvana +3 输入n,求1到n的数字,哪个数逐位相乘的积最大,输出最大积. 思路是按位比较,从低到高,依次把小位换成全 ... 
- Codeforces Round #549 (Div. 1) 题解
		link 前几天补完了某一场很早以前的div1,突然想来更博客,于是就有了这篇文章 A The Beatles 显然若起点和第一次到达的位置距离为 d ,那么经过的不同站点数为 $\frac{nk}{ ... 
- Codeforces Round #549 (Div. 2)  Solution
		传送门 A.The Doors 看懂题目就会写的题 给一个 $01$ 序列,找到最早的位置使得 $0$ 或 $1$ 已经全部出现 #include<iostream> #include&l ... 
- Codeforces Round #381 (Div. 2)  复习倍增//
		刷了这套题 感触良多 我想 感觉上的差一点就是差很多吧 . 每次都差一点 就是差很多了... 不能气馁..要更加努力去填补那一点点. 老天不是在造物弄人,而是希望你用更好的自己去迎接自己. A. ... 
- [ 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 ... 
- Codeforces Round #549 (Div. 2) F 数形结合 + 凸包(新坑)
		https://codeforces.com/contest/1143/problem/F 题意 有n条形如\(y=x^2+bx+c\)的抛物线,问有多少条抛物线上方没有其他抛物线的交点 题解 \(y ... 
- 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为起始位 ... 
随机推荐
- 转:对softmax讲解比较清楚的博客
			https://blog.csdn.net/wgj99991111/article/details/83586508 
- jQuery 源码分析(二) 入口模块
			jQuery返回的对象本质上是一个JavaScript对象,而入口模块则可以保存对应的节点的引用,然后供其它模块操作 我们创建jQuery对象时可以给jQuery传递各种不同的选择器,如下: fals ... 
- Practical Go: Real world advice for writing maintainable Go programs
			转自:https://dave.cheney.net/practical-go/presentations/qcon-china.html?from=timeline 1. Guiding pri ... 
- python Condition
			import threading # 必须要使用condition的例子 # class XiaoAi(threading.Thread):# def __init__(self, lock):# s ... 
- 初探云原生应用管理之:聊聊 Tekton 项目
			[编者的话]“人间四月芳菲尽,山寺桃花始盛开.” 越来越多专门给 Kubernetes 做应用发布的工具开始缤纷呈现,帮助大家管理和发布不断增多的 Kubernetes 应用.在做技术选型的时候,我们 ... 
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)
			在sql中怎么查看一个字符的ascii编码或Unicode编码: SELECT ASCII('a') AS [AsciiNum]--字符获取ASCII码 SELECT UNICODE(N'a') AS ... 
- Swagger实例分享(VS+WebApi+Swashbuckle)
			Swagger实例分享(VS+WebApi+Swashbuckle) Swagger可以很方便的为发布的WebApi自动生成优雅的文档,不需额外自己编写,只需为项目配置好,是一个很好用的工具,做一个简 ... 
- 排序算法Java代码实现(二)—— 冒泡排序
			本篇内容: 冒泡排序 冒泡排序 算法思想: 冒泡排序的原理是:从左到右,相邻元素进行比较. 每次比较一轮,就会找到序列中最大的一个或最小的一个.这个数就会从序列的最右边冒出来. 代码实现: /** * ... 
- 前端vue项目js中怎么保证链式调用后台接口
			在一个for循环中对同一接口调用多次,如何保证逐步执行,同步执行. html部分 <DcFileUpload v-for="(item, index) of fileLengthLis ... 
- Valgrind调试
			Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖 摘自 Valgrind.org: Valg ... 
