codeforces泛做..

时间:2023-03-08 20:25:05

前面说点什么..

为了完成日常积累,傻逼呵呵的我决定来一发codeforces 挑水题 泛做..

嗯对,就是泛做..

主要就是把codeforces Div.1的ABCD都尝试一下吧0.0..

挖坑0.0..

Codeforces Round #360

A. NP-Hard Problem

就是一个二分图染色,判断是否为二分图而已..

B. Remainders Game

题意:有一个未知的\(x\)和已知\(x\ mod\ c_i\)的值,问是否能确定\(x\ mod\ k\)的值

考虑一下中国剩余定理,由这些不等式是可以得到\(x\ mod\ lcm(c_i)\)的值的,那么也就是说是可以知道\(x=lcm(c_i)\times t+res\),其中\(t\)是常数
那么只要\(gcd(k,lcm(c_i))=k\)就能够知道答案的值,否则就不
这道题有个trick,是HWizard大爷教我的(%%%HWizard):因为\(lcm(c_i)\)是非常大的,所以我们可以先把\(c_i\)变成\(gcd(c_i,k)\),这样不会导致上面的问题..

C. The Values You Can Make

题意:给出\(n\)个硬币,价值为\(c_i\),求所有得到\(k\)面值的硬币集合所能达到的所有子面值..

定义\(f_{i,j,k}\)为前\(i\)个硬币,凑齐了\(j\)面值,能够达到\(k\)面值的情况..
递推一下就好了
复杂度为\(O(nk^2)\)

D. Dividing Kingdom II

题意:\(n\)个点,\(m\)条双向边,每个询问把\([l...r]\)的边加到图中,把点黑白染色,求所存在边两端点相同颜色中所有边权的最大值,不存在这种边就输出\(-1\)

考虑一种贪心策略,假设\([l...r]\)的边按边权从大到小依次加入,那么对于前面的边当然是让他们两端点染色不同答案才不会是那条边的边权而是后面比它更小的答案,就用一个带权并查集维护一下就好了..
这种做法的复杂度是\(O(qm)\)的,也不知道为什么能过..

Codeforces Round #361

D. Friends and Subsequences

题意:有两个大小为\(n\)的数组\(a\)、\(b\),求区间个数,使得该区间内\(\max\limits_{i=l}^{r}a_i=\min\limits_{i=l}^{r}b_i\)..

扫一遍右端点\(r\),设\(mx_i\)表示\([i,r]\)里\(a\)的最大值,\(mn_i\)表示\([i,r]\)里\(b\)的最小值
那么\(mx\)是单调不升的,\(mn\)是单调不降的
所以\(mx_i-mn_i\)是单调不升的
就可以二分一个区间\(mx_i-mn_i\)都是等于\(0\)的就是答案啦..

E. Mike and Geometry Problem

题意:给出\(n\)条线段,求每\(k\)条线段交集的长度和..

离散化,针对离散化后的每个区间来做
如果这个区间有\(p(p\geq k)\)条线段覆盖了,那么这个区间就会贡献\(len\times C_k^p\)的答案

Codeforces Round #362

A. Lorenzo Von Matterhorn

题意:有一棵满二叉树,\(i\)节点的孩子为\(2i\)和\(2i+1\),操作是把\(u\)到\(v\)的路径上的边权全部加上\(w\),询问是问\(u\)到\(v\)的路径长度

对于操作,把\(lca\)到\(u\)、\(v\)的路径上所有点权全部加上\(w\)
对于询问,把\(lca\)到\(u\)、\(v\)的路径上所有点权全部加起来就可以了..
用map来映射就行了..

B. Puzzles

题意:给出一棵树,问每个点的期望dfs序..

对于\(x\)节点的两个孩子\(y_1\)、\(y_2\),\(y_2\)对\(y_1\)的贡献就是有\(\dfrac{1}{2}\)的概率贡献\(size_{y_2}\),有\(\dfrac{1}{2}\)贡献\(0\),那么总贡献就是除它以外所有孩子的size和除以2

C. PLEASE

题意:三个杯子,一个钥匙一开始放在中间的杯子里,每次有\(\dfrac{1}{2}\)的概率交换前两个,有\(\dfrac{1}{2}\)的概率交换后两个,进行\(n=a_1a_2a_3...a_k\)次操作后钥匙还在中间的概率..

那么很容易推出这样的一个矩阵来推移:\[\begin{pmatrix}\dfrac{1}{2}&\dfrac{1}{2}&0\\\dfrac{1}{2}&0&\dfrac{1}{2}\\0&\dfrac{1}{2}&\dfrac{1}{2}\end{pmatrix}\]
然后再推多几个矩阵就可以得到以下几个矩阵:\[\begin{pmatrix}\dfrac{1}{2}&\dfrac{1}{2}&0\\\dfrac{1}{2}&0&\dfrac{1}{2}\\0&\dfrac{1}{2}&\dfrac{1}{2}\end{pmatrix}\begin{pmatrix}\dfrac{1}{2}&\dfrac{1}{4}&\dfrac{1}{4}\\\dfrac{1}{4}&\dfrac{1}{2}&\dfrac{1}{4}\\\dfrac{1}{4}&\dfrac{1}{4}&\dfrac{1}{2}\end{pmatrix}\begin{pmatrix}\dfrac{3}{8}&\dfrac{3}{8}&\dfrac{1}{4}\\\dfrac{3}{8}&\dfrac{1}{4}&\dfrac{3}{8}\\\dfrac{1}{4}&\dfrac{3}{8}&\dfrac{3}{8}\end{pmatrix}\]
然后一个一个推下去就会发现答案是酱紫的一个序列:\[\dfrac{0}{1},\dfrac{1}{2},\dfrac{1}{4},\dfrac{3}{8},\dfrac{5}{16},\dfrac{11}{32},\dfrac{21}{64}...\]
那么这个时候我找到一条规律:分子是\(f_i=2f_{i-2}+f_{i-1}\),分母就是\(2^{n-1}\)
然后用这个东西矩乘一下发现常数太大TLE了.. 就去请教HWizard大爷..
他就帮我化了个分子的通项公式:\[f_n=\left\{
\begin{aligned}
\dfrac{1}{3}(2^{n-1}-1),\ n\ mod\ 2\ = 1 \\
\dfrac{1}{3}(2^{n-1}+1),\ n\ mod\ 2\ = 0
\end{aligned}
\right.\]
瞬间就会做了0.0..

D. Legen...

不说了AC自动机+dp+矩阵优化的大水题..

Codeforces Round #363

A. Vacations

感觉不会太难,没做..

B. Fix a Tree

题意:给出\(n\)个点,每个点都有一个父亲,要求改最少的父亲使得这变成一棵树

很容易就看出只有环是要改的,而且随便改一个点连到根就可以了..
那就是很水的题了..

C. LRU

题意:有\(n\)个数,有\(m\)个格子,进行\(10^{100}\)次操作,每次从\(n\)个数里面随便找出一个数,每个数有\(a_i\)的几率被选中,如果已经在\(m\)个格子里就不用管,不然就替换掉最早放的那个,问每个数最后在这\(m\)个格子的概率..

因为进行了很多次,那么这\(m\)个格子最后的状态只和最后\(m\)次操作有关..
然后就状压DP就好了..

Codeforces Round #364

A. As Fast As Possible

这道题是比赛的时候做的..
就是让所有船全部同时到达就对了,大概是酱紫(但是精度不允许):
codeforces泛做..

精度的话就二分一下吧0.0..

B. Connecting Universities

题意:一棵树有\(2k\)个黑点,两两黑点配对,问每一对距离的和最大是多少..

以\(1\)为根,\(f_i\)表示\(i\)的子树内的黑点个数
那么对于某条边\((fa,x)\),能做出的最大贡献就是\(min(f_i,2k-f_i)\)
把所有边的最大贡献加起来就好了

C. Break Up

题意:\(n\)个点\(m\)条边的无向图,每条边都有边权,给出\(s\)和\(t\),要求最多删去两条边,使得\(s\)和\(t\)不连通,求最小花费以及方案.

先判断是否连通,然后找一条从\(s\)到\(t\)的简单路径,这条路径肯定有一条边要删
枚举删去哪一条边,然后再用双连通分量判断,如果已不连通答案就是这条边的边权,否则就删去\(s\)到\(t\)中间的桥
总体复杂度是\(O(nm)\)的

Codeforces Round #365

这套题比较水.. 基本都是一眼题0.0..

Codeforces Round #366

A. Thor

题意:就是雷神托尔闲着无聊玩手机,然后有好多好多的app消息,\(n\)个app,\(q\)个操作
1.第\(x\)个app发了一条消息
2.托尔一次性把第\(x\)个app的消息全部读完
3.托尔把最早发的前\(t\)条读完..
要求输出每个操作之后的剩余未读消息

那么就是线段树维护一下每个app剩余的未读消息,再搞个队列保存前几个消息是哪个app发的就行了0.0..
水题0.0..

B. Ant Man

题意:Scott Lang is at war with Darren Cross.然后蚁人要从\(s\)跳过所有的点在\(e\)结束,问最小费用..
\(a_i\)表示从比\(i\)大的节点跳入\(i\)节点的花费
\(b_i\)表示从比\(i\)小的节点跳入\(i\)节点的花费
\(c_i\)表示从\(i\)跳出到比\(i\)小的节点的花费
\(d_i\)表示从\(i\)跳出到比\(i\)大的节点的花费

dp即可,\(f_{i,j,k}\)表示\(1...i\)剩余匹配入度为\(j\),出度为\(k\)的最小花费..
乱转移0.0..

C. Black Widow

题意:听说黑寡妇试手枪还要验证方程..
就是题目所给的方程,每个数出现次数不超过2,每个括号内个数不超过2..

把每个括号当做一条边,那么每个点度数最多为2,也就是说这个图要不就是链,要不就是环..
那么分这两种情况dp就好了..

其中环的要仔细看看,选其中一个点为0搞一次,为1搞一次,加起来就是答案

Codeforces Round #374

E. Road to Home

题意:自己看,不好讲..

正解是分\(p\leq100\)和\(p>100\)来做的..
\(p\leq100\)时,可以结束的点就很少,\(p>100\)时,答案就不会很大..
按照这个就可以做了

这里提供一种比较神奇的方法 %%%lych_cys
设\(f_i\)为在第\(i\)个区间结束的最多次数,\(g_i\)为在第\(i\)个区间结束最左边的结束位置..
那么只要找之前的区间跳\(t\)能跳到当前区间,再找第一个不能跳到当前区间的就行了,这样是均摊\(O(n)\)的
只是要对前面的取\(min\)不然会炸..

Codeforces Round #375

E. One-Way Reform

题意:\(n\)个点\(m\)条边的无向图,给边定向,使得有最多的点入度等于出度

把所有奇数度数的点合在一起,那么所有的点的度数都为偶数,就是一个很显然的欧拉回路了..

F. st-Spanning Tree

题意:\(n\)个点\(m\)条边的无向图,问是否存在一种生成树方案,使得\(s\)的度数不超过\(ds\),\(t\)的度数不超过\(dt\)

先把跟\(s\)、\(t\)无关的边加上去,然后缩点
1.\(s\)和\(t\)连一条边,那么剩余的每个点只要有\(s\)和\(t\)任意一个点连它就可以了
2.\(s\)和\(t\)不连边,那么要有一个点连\(s\)和\(t\),其余每个点找一个就行了..