• Codeforces Round 286


    Codeforces Round 286

    https://codeforces.com/contest/505

    A

    给出一个长度为n的字符串。

    询问是否可以插入一个小写英文字母使其成为回文

    n<10

    直接暴力

    B

    给出一个n个点m条边的无向图。

    每条边有一个颜色ci。

    q次询问,每次询问两个数ui和vi

    求满足以下条件的颜色个数,该颜色的边直接或间接连接ui和vi

    n<=100 m<=100 q<=100

    做法:

    暴力枚举颜色,用并查集维护一下连通性。

    C

    n颗宝石,第i颗宝石位于pi岛上。

    一共30000个岛。

    一开始我在0号岛。

    首先,我从0号岛跳到d号岛。

    之后,设L为上次跳跃的距离,下一次可以跳L-1,L或L+1,但不能不跳。

    询问可以收集的最大数量的宝石。

    n,d<=30000

    做法:

    一个很妙的DP Trick。

    定义方程\(dp[i][j]\)表示到第\(i\)步,步伐长度变化j的能收集到的最大宝石数量。

    然后根据\(dp[i][j]\)这个值去往后更新。

    根据等差数列求和的性质,这个j不会太大,大概是-300到300。

    D

    n个城市。

    有m对城市是重要的。

    我计划建造单向边,使得对于每一对城市(ai,bi),都可以通过单向边从ai到bi。

    找出需要建造的最少数量的单向边方案,打印最少数量即可。

    n,m<=100000

    做法:

    结论:

    不同连通块之间显然不需要边,所以单独考虑每个连通块。

    一个连通块内如果没有环,可以根据拓扑序重构成一条链满足题目要求。

    一个连通块内如果有环,不管有几个环,都可以通过一个大环来满足要求。

    所以答案是n-连通块数量+含环连通块数量。

    E

    我有n根竹子。

    第i根竹子高度位hi米,每天生长ai米。

    我每天可以使用魔力k次,每次可以将一根竹子变低p米。不会变成负数,变成0,但不会消失。

    现在我有m天,我要最小化m天后最高竹子的高度。

    询问m天后最高竹子的最低可能高度。

    n<=100000

    m<=5000

    k<=10

    p<=1e9

    做法:

    二分,m天后最高的竹子为H是否可行。

    然后反过来做。

    先统一在第m天把所有竹子变成H。

    然后每天,所有竹子高度变矮ai,你必须保证所有竹子高度>=0,且m天结束后竹子高度>=hi。

    用一个堆维护,当前状态下继续减少高度而不拔高,第m天结束后竹子高度会<hi的竹子,一直减少高度,多少天后的高度会<0。

    每次取出剩余天数最少的竹子,拔高即可。

    如果无论怎么拔高还是会<0的竹子,直接返回错误。

  • 相关阅读:
    elasticsearch 基础 —— 集群原理
    剑指 offer set 10 栈的压入、弹出序列
    剑指 offer set 9 包含min函数的栈
    剑指 offer set 8 树的子结构
    剑指 offer set 7 调整数组顺序使奇数位于偶数前面
    剑指 offer set 6 打印从 1 到 N 的所有数
    剑指 offer set 5 二进制中 1 的个数
    剑指 offer set 4 矩形覆盖
    剑指 offer set 3 旋转数组的最小数字
    剑指 offer set 2 从头到尾打印链表
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/15599926.html
Copyright © 2020-2023  润新知