300iq Contest 1 简要题解

Angle Beats

二分图 L 字匹配,考虑把每个 * 拆成两个点,一个跟左/右的 . 连边,一个跟上/下的 . 连边,然后把每个 + 拆成两个点,两个都跟上下左右的 . 连边。
然后跑带花树之后构造方案即可
code


Best Subsequence

考虑二分答案,然后发现最小值一定会被选,因此把最小值 shift 到开头用线段树维护 dp 即可。
貌似能 O(nlogn),好像是考虑相邻两个数一定有一个不超过二分值的一半
code


Cool Pairs

考虑把 a 序列搞成 \(-n\)~\(-1\) ,然后 b 序列在 sort 后可以是一段 0 的前缀,一个或者零个 \(1\)~ \(n-1\) 的数,然后一段 n 的后缀。
code


Dates

首先可以建出二分图最大费用流模型,由于费用流跟源点汇点相连的边不会退流,因此可以按照权值从大到小贪心,如果能加就加。
考虑用 Hall 定理判定能不能加入。
如果枚举的集合形成若干连续段,那么只需要每个连续段分别满足条件即可,因此枚举的集合的区间并一定是一个区间。
又因为 \(L_i\le L_{i+1},R_i\le R_{i+1}\) ,所以只用考虑选择的区间标号也是连续的情况。
我们设 \(b_i\) 表示 \(i\) 是否被选。
那么必须要满足 \(\min\limits_{l,r}\{\sum\limits_{i=L_l}^{R_r}a_i-\sum\limits_{i=l}^rb_i\}\ge0\)
\(a\) 记前缀和差分,发现是 \(\min\limits_{l,r}\{a_{R_r}-a_{L_l-1}-\sum\limits_{i=l}^rb_i\}\ge0\)
然后可以线段树维护了。
code


Expected Value

直接高消显然没法过,考虑设 \(f_i\) 表示步数 \(>i\) 的概率,\(g_{i,j}\) 表示走 \(i\) 步到 \(j\) 的概率,显然可以矩乘转移 \(g\) ,由于 \(f_i=\sum\limits_{j=1}^{n-1}g_{i,j}\) ,因此可以用 BM 求出 \(f\) 的特征多项式 \(C\) ,我们设 \(f\) 的生成函数是 \(F\) ,那么 \(F=F*C+F_0\)
考虑答案就是 \(F(1)=\frac{F_0(1)}{1-C(1)}\) ,直接算即可。
code


Free Edges

发现一棵树可以直接消完,如果有环一定消不完,所以就是统计把这个消成一个森林需要砍掉的最小边数。
code


Graph Counting

考虑模仿 \(Tutte\) 定理里面的一个过程,我们设所有度数为 \(|V|-1\) 的点的集合为 \(S\) ,那么剩下的一定是 \(|S|+2k,k>0\) 个奇团,由于加一条边就要完美匹配,因此 \(k=1\) ,然后就是拆分数裸题。
code


Hall's Theorem

考虑第 \(i\) 个左侧点往前 \(a_i\) 个右侧点连边,且 \(a_i\ge a_{i-1}\)
这样不好的集合个数就是 \(2^n-1-\sum\limits_{i=1}^n\sum\limits_{j=0}^{a_i-1}C_{i-1}^j\) ,然后构造即可。
code


Interesting Graph

分析一下题目中的条件发现每个连通块大小 \(<7\) ,那么可以求出每种连通块的染色方案和每种连通块的个数然后暴力 merge
code


Jealous Split

首先把条件转化把序列分为 K 段使得每段平方和最小,这个容易证明其正确性。
然后可以凸优化+斜率优化,但可能会跳过正确的 K
考虑这个式子是满足决策单调性的,也就是对于一个点其决策点是一个连续段,可以推出合法的段数也是连续段,因此我们在斜率 dp 的时候同时求出段数的最值
然后就能输出方案了
code


Knowledge

对于任意一个串都可以经过若干次操作得到一个唯一的长度最短的串。
我们把缩串后相同的串看成一个等价类。
手玩出所有等价类和等价类之间的转移之后跑矩阵快速幂即可。
code

posted @ 2020-03-26 12:05  soroboruo  阅读(189)  评论(0编辑  收藏