Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CodeForces #549 Div.2 ELynyrd Skynyrd

CodeForces #549 Div.2 ELynyrd Skynyrd

作者头像
ShenduCC
发布于 2019-05-09 08:04:01
发布于 2019-05-09 08:04:01
2730
举报
文章被收录于专栏:算法修养算法修养

题目

这道题目实际上可以用动态规划来做。

对于每个区间,我们从右边边界,往左边走,如果能走n-1次,那说明以右边边界为起点存在一个题目中说的子链。

利用倍增算法,实际上倍增也是动态规划。f[i][j] 表示以i为结尾,能够往前走 2^j 次所到达的位置。

最后就是寻找以每个点为右边边界,往前走,能走到n-1次的,并且走的距离最近的的那点,那么在这个点的左边都是满足条件的,在这个点的右边都是不满足条件的。

AC代码

代码语言:javascript
AI代码解释
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SDUT 2019 级程序设计基础(B)II 实验6–动态规划
在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数n大于1小于等于100,数字为 0 – 99 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Here_SDUT
2022/06/29
3680
SDUT 2019 级程序设计基础(B)II 实验6–动态规划
【概率期望动态规划】
1~8题出处:hdu4576   poj2096   zoj3329   poj3744   hdu4089   hdu4035   hdu4405   hdu4418
attack
2018/09/17
1.1K0
【概率期望动态规划】
「2017 Multi-University Training Contest 2」2017多校训练2
给定数组a[1..n]和b[1..n],b[i]在[1~n]内。要得到a[n+1..2n],每次选b数组的一个,令a[i]为j=b[k]到i-1位置中最大的a[j]-j。求a[n+1..2n]总和最大值。
饶文津
2020/06/02
4090
「2017 Multi-University Training Contest 2」2017多校训练2
Codeforces 的题目真的值得算法竞赛选手训练吗?
个串,有两种操作,一种是给某个串加一个字符,另一种是求存不存在一个串是查询串的子串。强制在线。
ACM算法日常
2021/11/10
1K0
Codeforces Round #361 div2
  有n个城市, 第i个城市到第j个城市需要消耗abs(i - j)的能量, 然后每个城市可以转移到另一个城市, 只需要一个能量, 转移是单向的。
熙世
2019/07/14
5170
状态压缩DP(大佬写的很好,转来看)
奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了。难点在于以下几个方面:状态怎么压缩?压缩后怎么表示?怎么转移?是否具有最优子结构?是否满足后效性?涉及到一些位运算的操作,虽然比较抽象,但本质还是动态规划。找准动态规划几个方面的问题,深刻理解动态规划的原理,开动脑筋思考问题。这才是掌握动态规划的关键。
风骨散人Chiam
2020/10/28
1.2K0
Codeforces Round #328 div2
  玩家A执白子,先走。 白子只能向上走,黑子只能向下走。如果有障碍物则不能走, 比如白色的上方有一个黑子,那么白子不能走。
熙世
2019/07/14
3020
POJ-2353 Ministry(动态规划)
Ministry Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4761 Accepted: 1528 Special Judge Description Mr. F. wants to get a document be signed by a minister. A minister signs a document only if it is approved by his ministry
ShenduCC
2018/04/26
6110
Codeforces Round #327 div2
  有一段长度为l的路,两个人分别在两个端点,1, l。 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置。
熙世
2019/07/14
3850
2021(ICPC)亚洲区域赛昆明站(CGHIJLM)
有n个城市,每个城市归某个议院管辖,每次可以选择相邻的几座归属于同一个议院的城市,将他们交给别的议院管辖,问最少的操作数使得最终全部城市归属一个议院。初始状态时,一个议院最多管辖15座城市。
Here_SDUT
2022/08/09
1.3K0
Codeforces Round #549(div1)简析
正解貌似有分四种情况什么的,我做时是发现各个起点其实都等价的,所以随便选一个起点,再暴举终点以暴举答案,更新即可。
ACM算法日常
2019/04/25
4550
Codeforces Round #360 div2
  有d天, n个人。如果这n个人同时出现, 那么你就赢不了他们所有的人, 除此之外, 你可以赢他们所有到场的人。
熙世
2019/07/14
4110
【CodeForces 261B】Maxim and Restaurant(DP,期望)
第一种解法是O(n^3*p)的:f[i][j][k]表示前i个人进j个人长度为k有几种方案(排列固定为123..n时)。f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][k-a[i]]最外层枚举t表示被卡的那个人。i=t时不加上f[i-1][j-1][k-a[i]]。ans={{(\sum f[n][j][k]*j*j!*(n-1-j)!)+(\sum f[n][n][k]*n)}}/(n!)。
饶文津
2020/06/02
4520
动态规划集合
动态规划,少说也做了,30 40道了但是感觉还是没有入门,接下来一星期将重新做动态规划,hdu入门的,uva入门的,外加poj的,把动态规划都重新学一下 01背包知识点  1.Robberies (hdu2955)  (01背包变形) 第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和… 实际上可以将其转化为安全的概率,则两个概率相乘,就是两次抢劫的安全概率了。     正确的方程是:f[j]=max(dp[j],dp[j-
用户1624346
2018/04/17
1.1K0
区间dp入门_状压dp
j~ends堆合并 = 较小的(原来, 分割点i坐部分重量 + 分割点i右边部分重量 + 合并后两堆总重量)
全栈程序员站长
2022/10/05
7770
区间dp入门_状压dp
Codeforces Round #178 (Div. 2)
题意:在n条电线上有不同数量的鸟, Shaass开了m枪,每一枪打的是第xi条电线上的第yi只鸟,然后被打中的这只鸟左边的飞到第i-1条电线上,右边的飞到i+1条电线上,没有落脚点的鸟会飞走。
xindoo
2021/01/22
3320
题解:Edu Codeforces 109(div2)
告诉你需要配置药剂的浓度k%,药剂由水和药混合而成,让你找到药剂最小的剂量,满足浓度为k%,浓度计算方法:药的体积/药剂总体积。
Here_SDUT
2022/08/09
7610
CodeForces #626 DIV2
题意:题意是这样的,给你一个列向量b和行向量a,二者相乘ab,是一个nm的0,1矩阵,问你在这个矩阵里,有多少个不同的矩形,都有1组成,面积为k
ShenduCC
2020/03/09
3930
【队伍训练3】Codeforces Round #661 (Div. 3)
A 签到 #include<bits/stdc++.h> #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; int a[105]; int main(){ ios int n,t; cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i];
杨鹏伟
2020/09/10
3680
codeforces 327 A Ciel and Dancing
给你一串只有0和1的数字,然后对某一区间的数翻转1次(0变1 1变0),只翻转一次而且不能不翻转,然后让你计算最多可能出现多少个1。
xindoo
2021/01/22
2600
相关推荐
SDUT 2019 级程序设计基础(B)II 实验6–动态规划
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档