Atcoder 泛做

AGC035C
如果 n 是二次幂答案肯定是 No,别的情况构造一个以 1 为中心的菊花,挂成若干像 2-3-1-2-3,4-5-1-4-5 的链,n 是偶数把 n 找个地方挂上去就行

AGC035D
用 $ f_{l, r, L, R} $ 表示删掉 $ [l, r] $ 这个区间中的数,被加到左边的数的系数是 L,被加到右边的数的系数是 R 的最小权值,粗略估计一下状态数是 $ 2^n \cdot n^2 $ 的,最终答案是 $ f_{2, n - 1, 1, 1} + a_1 + a_n $

AGC035F
考虑怎么样的情况答案会被算重

  • 第 i 行前 j 个数加 1,第 j 列前 i - 1 个数加 1
  • 第 i 行前 j - 1 个数加 1,第 j 列前 i 个数加 1

我们只需要让答案中不存在某一种情况即可,变成计算不存在 $ a_i = j, b_j = i-1 $ 的两个序列的方案数,容斥即可

AGC029F
考虑从每个集合到集合内的点连边,容易发现图形成一个二分图,如果有解一定可以找到一个大小为 $ n - 1 $ 的完美匹配,对找到的生成树找一个根,每个集合是一条边,可以匹配边的两端点中深度大的点。找到匹配后随便找个方案即可,如果没找到方案意味着二分图不连通

AGC037D
将一个数字重标号成最后所在的行的编号,我们要做的事情就是在第一次操作后使得每一列都是一个 1 ~ n 的排列,第二次操作将每个数放到该到的行去,第三次操作将每个数放到该放的行去
考虑每次把一列变成一个 1 ~ n 的排列,如果把第 i 行向这行能放的数连边,相当于找一个最大匹配,根据 hall 定理一定存在这个最大匹配,构造一下就行了

AGC020E
实现一个函数 solve(a) 表示求 a 这个 01 序列的答案,每次找一个子区间划分成 >= 2 个区间递归下去求方案数,相当于把这个子区间变成了 (A*x) 的形式继续做 A,dp 下就行了,递归要记忆化,合法的区间个数上界是 $ n^2 log(n) $ 个,复杂度 $ O(n^3 log(n)) $

posted @ 2020-09-10 15:51  LJC00118  阅读(607)  评论(0编辑  收藏  举报
/*
*/