CF 刷题计划 4

应该是 OI 退役前最后一次发「CF 刷题计划」了。
难度范围实时浮动,取决于智商浮动。

反正也不会再出模拟赛了,所以干脆都放上来吧。

难度标识(0-5):
标准参考
EZ 一眼丁真
HD 需要时间思考
IN 需要题解提示
AT 需要仔细阅读题解

00 1430G Yet Another DAG Problem

2600 IN
tag: DP 构造
状压DP,考虑转移顺序。
按照拓扑序一层一层转移,由于答案为 \(\sum \texttt{系数和}\times\texttt{这一层填的数字}\)。新建一层新的一层填 \(1\),其余的在原有基础上加 \(1\),所以直接加上所有的系数和即可。
新一层合法当且仅当新一层的所有入边都在原来的点集里。
\(O(3^n+2^nn)\)
https://codeforces.com/contest/1430/submission/229855729

01 1436F Sum Over Subsets

2800 AT-
tag: 莫比乌斯反演,计数
套一层莫比乌斯反演,转化为求 \(\gcd\)\(x\) 的倍数的方案。
所求式转化为 \((\sum_{x\in A}x)^2\cdot(|A|-1)\)
根据 \(\sum_{i=0}^n i \binom{n}{i}=n2^{n-1}\)
对于 \(a_i^2\) 贡献为 \((s-1) 2^{s-2}\)
对于 \(a_i\cdot a_j\) 的贡献为 \((s-2) 2^{s-3}+ 2^{s-2}\)
分别计算即可。\(O(n\ln n)\)
https://codeforces.com/contest/1436/submission/229941700

02 1437F Emotional Fishermen

2600 IN-
tag: DP 计数
显然需要排序。设 \(i'=\max\limits_{2a_j\le a_i}j\)
考虑 \(f_i\)\(1\sim i'\)\(i\) 的方案数量。
考虑从 \(j\) 转移。
发现只要 \(1\sim j'\)\(j\) 确定,\(i\) 一定确定,所以总共有 \(n-j'-2\) 个空位。
需要放置的有 \(j'+1\sim j-1\)\(j+1\sim i'\)\(i'-j'-1\) 个。
注意可能 \(a_i\) 直接放第一个。
\(f_i=A_{n-1}^{i'}+\sum\limits_{j\le i'} A_{n-j'-2}^{i'-j'-1} f_j\)
https://codeforces.com/contest/1437/submission/229946659

03 1439B

2600 AT
tag: 构造,图论
困难图论题,调了很久。
首先考虑第一种情况,按照拓扑序依次删除度数 \(\le k\) 的点。如果最后有剩余的点就是答案。
考虑第二种,遇到度数为 \(k-1\) 的点把这 \(k\) 个点暴力跑。注意如果存在团 \(k\)\(\sqrt m\) 级别的,度数大于等于 \(k-1\) 的点只有 \(m/k\) 的级别,所以复杂度是 \(O(m\sqrt m\log m)\),哈希 + 二分找边是否存在。
873ms,比较卡常。
https://codeforces.com/contest/1439/submission/229963732

04 1439C Greedy Shopping

2600 EZ
tag: 线段树 数据结构
一眼丁真,线段树二分!
由于序列单调不降,二分第一个小于 \(y\) 的位置,第一个操作直接转化为区间赋值。
第二个操作可以发现选的连续段数是 \(\log V\) 级别的。
\(O(T\log n\log V)\)
https://codeforces.com/contest/1439/submission/229968899

05 1442D Sum

2800 IN
tag: DP 分治
显然最多存在一个不选全。
直接前缀+后缀背包是 \(O(nk^2)\) 的。
考虑 分治,把一边的加入背包然后递归到另一边,直到区间长度为 \(1\),然后枚举这个选多少。
\(O(nk\log n)\)
https://codeforces.com/contest/1442/submission/229995923

06 1444C Team-Building

2500 HD
tag: 图论 二分图 计数
正难则反,找奇环。
首先考虑单独拿出来一个组,我们发现如果这个组内有奇环和任何组都不行。
然后考虑两个组,发现两个组之间至少要有两条边才能形成新的环。
考虑吧每个组的连通块都缩成两个点(黑点缩成一个,白点缩成一个,之间连边)。
枚举所以连接相同两个组的边,加入图中,找到奇环说明这两个组不行,答案减一。
\(O(m\log m)\),瓶颈在于排序把连接相同两个组的边找出来。
Tips:你需要处理 \([las,i)\) 的时候注意任选一个的时候应该选 \(i-1\) 而不是 \(i\),否则会 WA on 20。
https://codeforces.com/contest/1444/submission/230094302

07 1446D1 & 1446D2

2600&3000 AT
tag:众数 双指针 根号分治
首先整个的众数肯定在答案里面,否则一定扩展区间让整个序列众数作为当前序列的众数。
首先考虑枚举另一个作为区间众数的数字。考虑所以这个数字出现次数和整个区间众数次数相同的区间。
如果这两个数字不是区间的众数那么肯定可以扩展区间,所以肯定不优,所以计算入答案也是可行的。
因此直接把 \(x\) 记作 \(-1\),区间众数为 \(1\),求最大的为和零的区间即可。前缀和+桶可以 \(O(na_i)\)
考虑优化,出现次数大于 \(\sqrt n\) 的可以直接用上面的做法,因为这些数字不超过 \(\sqrt n\)
剩下的数字就是出现次数小于 \(\sqrt n\) 的,直接枚举众数出现的个数,双指针即可。
\(O(n \sqrt n)\)

08 1450E

2700 HD
tag: 最短路 图论
考虑枚举最小的点, 对于 \(b-11\) 的边建立正向权值为 \(1\)、反向权值为 \(-1\) 的边,\(b=0\) 建立权值为 \(1\) 的双向边。
求最短路,最短距离就是权值,然后判断每条边两端是否都合法。
如果出现权值是负的那么以这个点为源的最大值就是更大的,所以可以忽略。
\(O(n^m)\)
https://codeforces.com/contest/1450/submission/230107133

09 1452F

2900 IN-
tag DP,暴力,枚举
修改直接数组里面改(致敬贪吃蛇)。
考虑查询。发现把大于 \(2^k\) 变成若干个 \(2^k\) 最优,其次为对小于等于 \(2^k\) 的操作,最劣的是把大于 \(2^k\) 变成更小以及一些大于 \(2^k\) 的。
显然先考虑只用前两个能不能完成,如果可以直接输出。
否则尽量多使用前两个,发现最多只有一个大于 \(2^k\) 的是第三个操作。考虑枚举一个断点,留下更大的,其余更小的完全转化成 \(2^k\) 的进行第二个。计算取最大值。当然如果一个全部转化都不能,就全部转化一个,另一个只做不完全的转化。
\(O(nq)\)
https://codeforces.com/contest/1452/submission/230442263

0A 1451F

2700 IN
tag nim,博弈
考虑对于每个斜着的一行都是 nim。因此异或和不为 \(0\) 先手就能取到最后一个,否则后手能取到最后一个。
我们发现取到最后一个之后我们可以随意改变让下一行的状态,显然其余行的状态是在先手必胜/后手必胜反复横跳。
因此只要存在一行是先手必胜的那么就是先手必胜了。

0B 1452G

2700 AT-
tag DP bfs 点分治
如果 Alice 停在点 \(u\),那么答案就是距离 \(u\) 最近的 Bob 放置的卡片的距离。
Alice 选择一个答案最大能够停的点,当然这个点到起始点的距离小于到 Bob 放置卡片的最小距离。
\(f_j\)\(j\) 点到 Bob 放置的卡片的最小距离,那么 \(i\) 点答案就是 \(\max\limits_{dis(i,j)<f_j}f_j\)\(dis(i,j)\) 为两点间距离。
\(f\) 直接 bfs,然后就是一个路径问题,考虑点分。如果在同一个子树内的点对如果用过当前根的路径更新答案肯定更劣,所以不影响答案,不需要容斥。答案就是对于每个治中心取 \(\max\)
\(O(n\log n)\)
https://codeforces.com/contest/1452/submission/230488001

0C 1453F

2700 IN
tag DP
非常 AT。
考虑 \(i\to j\) 两个点之间只有 \(i\to j\) 这一条路径当且仅当 \(a_i+i\ge j\)\(\forall i<k<j, k+a_k\le j\)
考虑一条路径 \(s_1\to s_2\to \cdots \to s_k\),我们发现这条路径是唯一路径需要满足 \(s_i\) 不能直接一步到 \(s_{i+2}\)
所以需要设 \(f_{i,j}\)\(i,j\) 是路径最后两个点的答案。
对于所有的 \(i\) 可以枚举左端点,然后把一次性把所有的 \(j\) 都算出来。
\(O(n^2)\)
https://codeforces.com/contest/1453/submission/230621325

0D 1452E

2500 AT-
tag 贪心
非常 AT。
考虑按照左端点从小到大排序,那么靠左的区间的贡献只会在一个前缀,靠右的则是后缀。暴力计算前后缀最大贡献,合并即可。
\(O(m\log m+nm)\)
https://codeforces.com/contest/1452/submission/230621760

0E 1428E

2200 HD+
tag 数学 贪心
考虑一个萝卜砍成若干段,肯定是均匀的。
因此吧所有萝卜多砍一段的贡献都塞到堆里面贪心取即可。
https://codeforces.com/contest/1428/submission/230627995

0F 1681E

2600 EZ+
tag 图论 倍增
从外往内的转化为从内往外的,然后对于每个门前的点拎出来相邻层建边,倍增即可。
https://codeforces.com/contest/1681/submission/230637082

10 1474D

2200 HD
tag 贪心 构造
考虑怎样是合法的。显然我们可以对 \(1\) 操作到不能操作,然后换成 \(2\),如果第一个非零的大于第二个就不行了。
发现需要满足:奇数和偶数位加起来相等,并且对于 \(s_i=a_i-a_{i-1}+\cdots+a_2-a_1\)\(i\) 为偶数)有 \(0\le s_i\le a_{i+1}\)
考虑交换,我们只需要判断交换后是否符合即可。注意交换后交换的地方两位 \(s_i\) 特判,后面的就是都加上或者减去一个数,并且这个数字是已知的,也就是偶数位和减去奇数位的,所以从后往前扫即可。注意判断前面没有扫到的位是否合法,直接预先前缀和处理即可。当然注意虽然只改了两位但是影响到的有前面的 \(s_{i-1}\le a_i\),以及 \(s_i\) 和后面的。
细节比较多。
https://codeforces.com/contest/1474/submission/230683409

11 1455F

tag 字符串 DP
*2800

posted @ 2023-10-26 20:33  jiangtaizhe001  阅读(33)  评论(0编辑  收藏  举报