2022/11/11 集训题解
今天是双11又是疯狂星期四,所以vivo50。
T2
Description
给出 \(n\) 个点 \(m\) 条边的图,问有多少种边的子集使得全图是个联通的仙人掌。答案对 \(998244353\) 取模。
\(n\le 13,m\le n(n-1)/2\)
Solution
考场上面写 \(4^n\times n^2\) 结果没有调出来自闭了,整场比赛就崩了。/kk 现在才想起来是边只能属于一个简单环。
我们不妨设 \(f_{s,x}\) 表示集合 \(s\) 为联通仙人掌根为 \(x\) 的方案数,然后我们要考虑加入一个环,那我们就需要设计辅助状态 \(g_{S,u,v}\) 表示集合 \(S\) 是联通仙人掌根为 \(u\),且 \(u\to v\) 这条链上没有边被环覆盖。
然后顺便考虑一下就好了。复杂度 \(\Theta(3^nn^2)\)。
T3
Description
给出一个 \(n\) 个点 \(m\) 条边的无向图,满足点双大小 \(<s\),对于每个 \(k\in [1,c_{max}]\) 求出 \(k\) 染色方案数。
\(n\le 10^5,m\le 10^6,c_{max}\le 10^5,s\le 7\)
Solution
其实不是很难,但是被T2搞崩了就没有想。
我们放在广义圆方树上面考虑,可以发现的是,对于一个点双其实会影响的只有其割点的颜色,点双之间互不干扰。那我们完全可以对于每个点双暴力枚举其颜色划分集合。
接下来我们可以直接把每个点双对应的OGF相乘得到结果,然后多项式插值。但是因为 \(s\le 7\),所以本质不同的点双很少,所以用个STL暴力存一下就好了。
T4
Descriptionj
给出一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\),有 \(m\) 个操作,为 \(l_i,r_i,v_i\),表示从 \([l_i,r_i]\) 选一个位置 \(+1\),贡献为 \(v_i\)。从操作中选一个子集出来,需要满足对于每一个 \(i\) 都有其最后的值 \(\le a_i\),问最大权值是多少。
\(n,m\le 3\times 10^5\)
Solution
首先可以看出可以暴力费用流,然后似乎后面也不太好做了。
这时候可以看出一个贪心结论:
- 我们一定是按 \(v\) 从大到小,当前能加就加。
证明的话可以用拟阵,不过似乎可以考虑把一个权值更大的换成若干权值更小的,如果两者不能共存,那么权值更小的两两之间也不能共存,那么选权值更大的更优。当然,这个证明不是很严谨,权当一乐就行。
然后考虑如何快速做。发现我们似乎可以用 Hall 定理判断,又考虑到 \(l_i\le l_{i+1},r_i\le r_{i+1}\),所以需要判定的一定是选择出的集合的一段连续区间,假设我们选出了 \(s\) 个点,为 \(p_{1,2,...,s}\),那么就有:
其中 \(s_i\) 表示 \(\sum_{j=1}^{i} a_j\)。
注意到 \(i,j\) 实际上选出来的集合中的排名,那么我们设 \(g_i=s_i-\sum_{j} [r_{p_j}\le i],f_i=s_i-\sum_{j} [l_{p_j}\le i]\),那么上面的条件就可以写成 \(g_{r_{p_i}}\ge f_{l_{p_j}-1}\Rightarrow \forall i>j,g_i\ge f_j\)。那我们判断能否加入一个区间之间看一下前面的 \(\max\) 是否小于后面的 \(\min\) 即可。随便用个什么数据结构维护即可。