Loading

Codeforces 经典场

经典波兰球场

A. PolandBall and Hypothesis

其实就是让你判断一下质数,直接暴力就行。

B. PolandBall and Game

先把都有的说完,然后判断谁的集合更大即可。

C. PolandBall and Forest

树的直径

D. PolandBall and Polygon

根据欧拉公式 \(V-E+F=2\),算出 \(V,E\) 是容易的,所以就可以算 \(F\) 了。

E. PolandBall and White-Red graph

简单画一下发现 \(k=1,k>3\) 均无解。

  • \(k=2\)

\(n\le 3\) 时无解,否则只要有一个点没有全部和其他选上即可。

  • \(k=3\)

PolandBall and Gifts

  • 最多比较简单

就是置换环隔着选。

  • 最少

一个长度为 \(k\) 的环如果选了 \(x<k\) 个人,那不如选 \(x+1\) 个人。于是每个环都尽量选上,直接背包即可。

G. PolandBall and Many Other Balls

经典倍增FFT题。

写出dp的转移式子 \(f_{i,j}\) 代表前 \(i\) 个球取出 \(j\) 组的方案数,\(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}+f_{i-2,j-1}\)。写成生成函数的形式 \(F_{i}=(1+x)F_{i-1}+x^2F_{i-2}\),多项式乘法+快速幂即可。

你还可以算通项以及ODE暴解递推式。

CF1149

C. Tree Generator™

容易发现树上一条路径一定形如 ))...)((...(。也就是对于任意子段,去掉匹配了的括号后还剩下的部分。而这个东西还是不太好表示,我们有如下引理:

这个值等于 \(\max\limits_{k=l}^{r-1}s_{k+1,r}-s_{l,k}\),其中 \(s_{i,j}\) 代表把 ( 看成 \(1\)) 看成 \(-1\) 后区间 \([i,j]\) 的和。

证明 一定可以找到最后一个 ),当 \(k\) 取到这个位置时 \(s_{k+1,r}-s_{l,k}\) 显然就是答案。接下来证明这个值是最大的。在这个体系里面所有被匹配掉的括号贡献都是 \(0\),最后没被匹配掉的括号,\(k\) 往左往右都会变小,得证。

那么现在就是要求 \(\max\limits_{l,r} \max\limits_{k\in [l,r)}s_{k+1,r}-s_{l,k}\),即 \(\max\limits_{l,k,r}s_{k+1,r}-s_{l,k}\)。类似最大子段和,这个也可以用线段树来维护。

简单分类讨论 \(k\) 是取在区间中点的左边还是右边即可。

submission

D. CF1149D Abandoning Roads

难得自己想出来一道 3000 分的题,虽然说考试的时候打挂了...

首先先对较小的边缩点,然后求连通块内的最短路。显然,连通块内其实想怎么走就怎么走,但不能走较大的边。

然后不同连通块用较大的边连起来,就完事了?你发现较大的边走起来必须是一条链,也就是不能回到之前存在过连通块,比如说 \(1\to 2\to 3\to 4\) 边权都是 \(3\),而 \(1\to 5\to 4\) 的边权都是 \(4\),这时走外面一圈会更短但是这不符合条件。

所以我们有一个暴力的思路,状压连通块。连通块的个数是 \(O(n)\) 的,仔细观察数据范围 \(n\le 70\)。然后发现只有一个点的连通块显然不用压,只有两个的也显然不用压,于是就只有 \(70/3=23\) 个连通块。

还是太多,观察三个点的连通块,由于 \(a<b\),所以其实也一定不会走出去再走回来,所以也不用压,于是要压的点只有 \(70/4=17\) 个了。最后跑最短路转移(类似最小斯坦纳树)即可。复杂度 \(O(2^{n/4}m\log m)\)

submission

E. Election Promises

神仙博弈题。首先如果没有第二个操作就是一个很简单的有向图博弈,设 \(val_u\) 代表所有 \(u\to v\)\(val_v\)\(mex\)\(s_x=\bigoplus_{val_u=x} h_u\)。结论:如果存在 \(s_x\ne 0\) 那么先手有必胜策略。

证明 可以说明如果不存在 \(s_{x}\ne 0\),那么下一步操作一定存在 \(s_x\ne 0\),否则下一步操作一定可以让 \(s_{x}\) 都为 \(0\)。而最后的必败态的 \(s_x\) 显然全为 \(0\),所以先手显然可以让后手进入必败态。

构造方案如下:找到一个最大的 \(s_x=0\)\(x\),然后找到一个可以减小的 \(u\),再把其出边都搞一遍,由于这是最大的,所以他的出边遍历所有 \(x\)

submission

posted @ 2023-03-17 09:48  Semsue  阅读(18)  评论(0编辑  收藏  举报
Title