zoukankan      html  css  js  c++  java
  • OI常见解题思路技巧大汇总【不定期更新】

    动态规划相关

    典例

    2019 CSP-S Day2-T1 Emiya 家今天的饭&题解

    类型
    • 若干种中每种选取若干个, 保证每种不超过总数的一半的方案数。
    思路
    • 如果直接考虑递推转移,需要实时维护每种选择的个数,才能保证满足条件。
    • 但是可以想到,若有某种超过了一半,其它的则不可能超过一半,用总方案数减去不合法的,枚举哪一种超过了一半,需要记录当前选了多少个,以及不合法的这种选择了多少。
    • 还可以继续优化,因为总数不确定,不妨不记录总数,而记录不合法减去合法的个数,最后大于 0 0 0的部分说明不合法的超过了一半。
    典例

    JZOJ 6439. 【GDOI2020模拟01.17】小 ω 数排列&题解
    JZOJ 4345. 【WC2016模拟】Fountain

    类型
    • 求相邻两数之间满足某种条件的排列方案数。
    思路
    • 考虑用DP依次加入每个数,不需要管当前已经加入的数构成的排列如何,可以只记录当前状态下的构成的“段数”。(因为题目限制只和相邻两数有关,所以已经被包含在中间的部分对后面没有影响)
    • 每次加入时考虑自成一段、加在某一段的某侧、加在某两段中间并将他们合并。
    • 如果题目需要,还要加入一维状态表示是否加在最后整段的左/右边界上(边界个数只可能为 0 / 1 / 2 0/1/2 0/1/2)。
    典例

    JZOJ 6809. 【2020.10.29提高组模拟】不难题&题解

    类型
    • 二维或多维空间中每个维度只能向某个方向走,其中若干点不能经过,求到达某个点的方案数。
    思路
    • 容斥,设 f i f_i fi表示只经过了第 i i i个不能经过的点的方案数,用到达它的总方案减去其它 f j ( x j ≤ x i , y j ≤ y i , . . . ) f_j(x_j leq x_i,y_jleq y_i,...) fj(xjxi,yjyi,...)
    • 把终点也视为一个不可经过的点,最后答案就是终点的 f f f值。

    树相关

    典例

    NOIP 2018 Day1-T3 赛道修建

    类型
    • 树上符合特定条件(如路径点数、边权和达到某个值)的最大路径条数,每个边只能被一条路径覆盖。
    思路
    • 从叶子节点往上做,到每个节点时,它的每个儿子会各自从下方延伸了一条尚不符合条件的路径到它(若符合条件,可以直接断开,答案加 1 1 1)。
    • 尽管路径再多,能继续向上延伸的也只有一条,剩下的在当前节点处两两匹配从而使它们尽可能多的对答案有贡献。
    • 以最优的方式匹配完,然后剩余的中选择最优的(如果没有则从该节点直接延伸)向上延伸。
    • 同时要注意虽然是以最优的方式两两匹配,但不能保证向上延伸的方案一定最优,最后还要重新扫一遍判断是否能有更劣却同样满足条件的匹配,使得延伸上去的路径更优。
    典例

    JZOJ 6813. 【2020.10.05提高组模拟】送信
    JZOJ 6276. 【noip提高组模拟1】树 &题解
    JZOJ 6874. 【2020.11.19提高组模拟】ZYT的答案

    类型
    • 树上有限制的路径计数或最优路径方案,限制与路径经过点对有关。
    思路
    • 考虑经过一个点对的条件,分两点为祖先关系或无祖先关系讨论,用dfs序来看则可以转化为二维/三维偏序问题。
    • 其中要特别注意的是,当点对互为祖先关系时,不妨设 ( x , y ) (x,y) (x,y) x x x y y y的祖先,并不是只有 y y y子树内连接 x x x子树外的路径能经过点对 ( x , y ) (x,y) (x,y),而是 y y y子树内连接 x x x的到 y y y路径上的那个儿子子树外的路径能经过点对 ( x , y ) (x,y) (x,y)
    典例

    JZOJ 1166. 树中点对距离
    JZOJ 6866. 【2020.11.16提高组模拟】路径大小差&题解

    类型
    • 树上符合某条件的路径计数,路径条件的判断能由子路径合并判断。
    思路
    • 点分治,过程中可能会算重同一棵子树内的两条路径组合,需要减去。

    计数相关

    • 动态规划相关、树相关中也有部分该类型的题,在此分类下便不再提及。
    典例

    JZOJ 6808. 【2020.10.29提高组模拟】easy&题解

    类型
    • 序列上统计符合某条件的区间个数,条件与区间最大值和最小值有关。
    思路
    • 这种题没有特别固定的解法,但大致可以用这种套路做。
    • 枚举区间左/右端点,顺着或倒着扫一遍,用数据结构实时修改,并查询答案。
    • 最值的修改可以用单调栈,弹栈时在数据结构上修改。

    杂类

    典例

    JZOJ 3583. 【GDOI2014模拟】小A的树

    类型
    • 若干区间中数的位运算,可以推广到树上路径中的位运算。
    思路
    • 如果是加法或乘法,那么可以直接维护前缀和/前缀积,位运算不像加法和乘法,可以通过逆运算减法和除法得到特定的值。
    • 但是如果拆位来看,与运算一定是前面一段连续的 1 1 1和后面一段连续的 0 0 0,或运算反之,这样就很好维护,最后再把每一位的答案加起来。
    典例

    JZOJ 3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll)

    类型
    • 某种连边方式下,最小的路径条数覆盖所有点,每个点只能被一条路径覆盖。
    思路
    • 这种题可以反着想,最初每个点自成一条路径,每连一次路径条数减少 1 1 1,那么合并的次数越多,路径条数越少。
    • 把所有的点分成入和出两边,能连边的两点之间出入连上,跑一边二分图最大匹配,用总点数减去最大匹配即为答案。
    典例

    COI 2020 Semafor&题解

    类型
    • 矩阵乘法快速维护DP,但转移矩阵过大。
    思路
    • 情况一:转移矩阵过大,但矩阵中会有一大部分为 0 0 0的的不合法状态,可以直接把有用的状态记下来直接转移有用的地方。
    • 情况二:对于若干对不同的转移,从题目本身的意义上它们矩阵中对应的数相同,则可以只记录每种真正不同转移之间的答案。
  • 相关阅读:
    java使用google开源工具实现图片压缩
    MyBatis实现Mysql数据库分库分表操作和总结
    简单记录你博客园的访问人数
    细说spring事务配置属性
    hazelcast初探
    jstorm之于storm
    如何让其他机器访问你的oracle数据库
    问题解决:bash: fork: retry: Resource temporarily unavailable
    分布式锁的几种实现方式
    建立索引的原则总结
  • 原文地址:https://www.cnblogs.com/LZA119/p/14279477.html
Copyright © 2011-2022 走看看