CodeForces #549 Div.2 ELynyrd Skynyrd 倍增算法
这道题目实际上可以用动态规划来做。
对于每个区间,我们从右边边界,往左边走,如果能走n-1次,那说明以右边边界为起点存在一个题目中说的子链。
利用倍增算法,实际上倍增也是动态规划。f[i][j] 表示以i为结尾,能够往前走 2^j 次所到达的位置。
最后就是寻找以每个点为右边边界,往前走,能走到n-1次的,并且走的距离最近的的那点,那么在这个点的左边都是满足条件的,在这个点的右边都是不满足条件的。
AC代码
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
#define N 200000
int n,m,q;
int f[N+5][20];
int pre[N+5];
int p[N+5];
int a[N+5];
int last[N+5];
int res[N+5];
int find(int x,int i)
{
if(x==0)
return i;
int j=0;
while(1)
{
if((int)pow(2.0,j)>x)
break;
else
j++;
}
if(f[i][j-1]!=0) {
x -= (int) pow(2.0, j - 1);
return find(x, f[i][j - 1]);
} else
return -1;
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
if(i!=0)
pre[p[i]]=p[i-1];
}
pre[p[0]]=p[n-1];
memset(last,0,sizeof(last));
memset(f,0,sizeof(f));
memset(res,-1,sizeof(res));
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
last[a[i]]=i;
f[i][0] = last[pre[a[i]]];
for(int j=1;j<20;j++)
{
f[i][j]=f[f[i][j-1]][j-1];
}
}
for(int i=1;i<=m;i++)
{
int x=find(n-1,i);
res[i]=max(res[i-1],x);
}
int l,r;
for(int i=0;i<q;i++)
{
scanf("%d%d",&l,&r);
if(l<=res[r])
printf("1");
else
printf("0");
}
printf("\n");
return 0;
}
CodeForces #549 Div.2 ELynyrd Skynyrd 倍增算法的更多相关文章
- CodeForces #549 Div.2 C Queen
题目 水题,dfs #include <iostream> #include <stdio.h> #include <algorithm> using namesp ...
- CodeForces #549 Div.2 D. The Beatles
题目 解题思路 关键是要 ,找出L 的组合,然后遍历L的组合,用最大公约数就可以算出来当前L的值要停多少次 怎么找出L的组合呢?饭店是每隔K 有一个,是重复的,我们只需要算出第一个饭店两侧,起点和停顿 ...
- 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 ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- [codeforces 549]G. Happy Line
[codeforces 549]G. Happy Line 试题描述 Do you like summer? Residents of Berland do. They especially love ...
- Codeforces #344 Div.2
Codeforces #344 Div.2 Interview 题目描述:求两个序列的子序列或操作的和的最大值 solution 签到题 时间复杂度:\(O(n^2)\) Print Check 题目 ...
- Codeforces #345 Div.1
Codeforces #345 Div.1 打CF有助于提高做题的正确率. Watchmen 题目描述:求欧拉距离等于曼哈顿距离的点对个数. solution 签到题,其实就是求有多少对点在同一行或同 ...
- LCA(最近公共祖先)之倍增算法
概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...
随机推荐
- spring和mybatis的整合开发(基于MapperScannerConfigurer的整合开发(适用于复杂项目,接口较多的情况))
在实际项目中,Dao层会包含很多接口,这样会导致spring配置文件过于臃肿.这时就需要采用扫描包的形式来配置mybaits中的映射器. 采用MapperScannerConfigurer来实现. M ...
- Log日志
Log.e("tag", "错误信息"); Log.w("tag", "警告信息"); Log.i("ta ...
- Leetcode#70. Climbing Stairs(爬楼梯)
题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解 ...
- 第六节,Python的科学计算包——Numpy
1.基本类型(array) import numpy as np a=[1,2,3,4] b=np.array(a) #array([1,2,3.4]) type(b) #<type 'nump ...
- Servlet中文件上传下载
1.文件下载: package FileUploadAndDown; import java.io.FileInputStream; import java.io.IOException; impor ...
- Laravel 服务容器,IoC,DI
DI DI 就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标. 那么,相应的,一个类需要另一个类才 ...
- sqlserver 迁移
背景 好久没用sqlserver了,好多东西也都记不住了,这次sqlserver同事问了几个问题,也一就回忆下.主要也把sqlserver的迁移过程列下.具体就不多说了. sqlserver 特点是只 ...
- c语言宏定义详解
1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数 ...
- xmind-postman
参考: https://www.jianshu.com/p/61cfcb436ee4 https://www.jellythink.com/archives/category/tool-tutoria ...
- shaderlab UV动画所需的变量声明
优化资源.美术需要迫使自己的顶点shader能够进行TRANSFORM_TEX运算,进行该运算的前提是需要声明一个 _MainTex_ST 变量,类型为float4即可. 此时就可以使用unity c ...