比赛日志
Codeforces Round 968 (Div. 2)
完成度 4/7,我的 D2 啊啊啊啊啊啊啊。
A:发现只需要关注字符串的开头结尾是否一样,因为只要中间有不同的字母就可以分出两段来,而大字符串的开头结尾是必选的,判断即可。
B:一眼以为博弈,转换一下题意就是小A每次删掉一个最小值,小B每次删掉一个最大值,小A先手,为最后剩下的数最大是多少,这个显然就是中位数,直接输出。
C:猜结论,考虑一个位置让他匹配的个数尽可能多,就让中间相同字符出现的时刻尽可能晚,那么就每次尽可能放与上一次不同的字符即可,记个数,直接输出。
D1:艹,调代码卡我半天,考虑一个序列最多只会进行两次操作,也最多只会存在两个不同的 \(\operatorname{mex}\),可以直接建图广搜倒着跑,给每个点更新最大值即可,最后还要处理那些取自己为最大值的点即可。
D2:感觉跟 D1 差不多,只是上面的边变成了你只能选择一条,换句话说,假如两个 \(\operatorname{mex}\) 是 \(x\) 和 \(y\),那么你要么把当前数变成 \(x\),要么当前数原本就是 \(x\),把他变成 \(y\),这东西直接深搜或者 dp 求最大值同 D1 计算答案即可。
E1,E2,F 待补。
Codeforces Round 969 (Div. 2)
口胡场,我是 nt。
A : 发现类似 1,2,3,这样连续三个数放到一起一定满足条件,然后第四个数不能要,所以提前判断一下开头的奇偶性,然后计数即可。
B : 发现答案只与最大值有关,且不会变化,只维护最大值的变化即可。
C : 注意力大题,发现我们一定能够等效的给每一个数加上 \(\gcd(x,y)\),直接暴力,我这都没注意到,菜死了菜死了。
D : 大分类讨论题,发现一个叶子结点是否有权值只与他到根节点这个序列的前后缀有关,换句话说,我们完全可以将一个叶子结点看做一个对 \((0/1,0/1)\),假如这两个值不同,那么这个叶子是有权值的,否则没有。那么我们就能发现根其实是个很重要的点,这样就能发现只要不是叶子和根的所有未染色的节点都是无用的,我们考虑只记录已经确定的叶子个数和未确定的叶子个数。分类讨论。
-
假设根是未确定的,且我们先把根拿了,答案是 \(\max(已确定黑叶子个数,已确定白叶子个数) + \left \lfloor \frac{未确定的叶子数}{2}\right \rfloor\)。
-
假设根未确定,且我们不拿根,让对面拿根,则答案是 \(\min(已确定黑叶子个数,已确定白叶子个数) + (已确定黑叶子 = 已确定白叶子 ? \left \lfloor \frac{未确定的叶子数}{2}\right \rfloor : \left \lceil \frac{未确定的叶子数}{2}\right \rceil)\)
-
否则,就是根已经确定了,假设这个根是白的,那么答案是 \(黑点数+\left \lceil \frac{未确定的叶子数}{2}\right \rceil)\)
-
还有就是根是黑的的情况,答案是 \(白点数 + \left \lceil \frac{未确定的叶子数}{2}\right \rceil)\)
以上仅为本人赛时口胡,不保证完全正确,等代码确定正确之后会删除本行。
E : 树按照 dfs 序排列是个重要性质,我们就可以直接预处理所有节点到下一个点的距离,然后能发现,只要一条路径上还有未确定的点,那么我们就可以把所有未定的点值全部放过去,然后取个最大次大,分类讨论看看次大是不是放在交叉路径更好就行了,未补代码,不完全保证正确性,保证之后会删掉本行。
2F 待补,div 1 待补。
Codeforces Round 970 (Div. 3)
完成度 6/8,又是 nt 场,耶。赛后 10min 才过 G。
A ~ F 都无伤的 (。
A:\(a\),\(b\) 都为偶一定可以正负正负全消掉,只有 \(b\) 为奇数可以拿两个 \(1\) 消掉,判断即可。
B:判断大小之后,按照题目给的标号方法依次判断每一行即可。
C:公差一定是一个 \(1,2,3,4...\) 的数列,直接算就行了,不会超过 5e4。
D:上上次 abc 的类似题,每个连通块是个基环树,并查集存大小直接算。
E:抽象题,场上卡我 50min,唐完了。预处理前后缀字母个数,判断需不需要删除,然后连接前后缀拿出现最多的字母算操作次数即可。
F:答案的分子是 \(\sum_{i=1}^{n} (a_i \times \sum_{j=i+1}^{n} a_j)\),处理后缀和直接算。
G:注意到,最后所有数的最小值一定是所有数的 gcd,然后通过这个 gcd 可以构造出一个公差为 gcd 的等差数列,直接算就行了。
H 一眼二分,但是场上 E 坐牢之后 G 坐牢,没有想完,明天补。
AtCoder Beginner Contest 370
怎么这年头 abc 都一场简单一场难的,糖分超标的场,我爱 A 题罚时。
开局没编译交 A 发现有三种情况,然后看到 C 这么长的玩意果断扔掉看 D,一眼可以树状数组然后没看数据范围,因为不认为 abc D 会这么麻烦,敲了个暴力发现 T 了,看数据范围大致一算过不了,这时候有点小爆炸,看了眼榜发现 C 题可能不需要写很长,然后就发现直接正反扫两遍直接输出就完了,唐。回头还是没想写 D,去看 E,感觉这东西不好搞,或许可以平衡树优化一下?唐氏想法,推了一下式子发现还是套路题,过掉之后只剩 30 min 了,回头搞 D,乱搞了个并查集,调了老半天,最后 10 min 看 F,发现类似之前的模拟赛,大致算了复杂度是对的,然后没发现还有第二问,敲完第一问只剩 5min,原地爆炸。
A,B,C,D 都挺抽象的,写 E 吧。
E : 写出转移式子 \(f_i = \sum_{j=1}^{i} f_j \times [pre_i - pre_j \ne k]\),其实就是 \(f_i\) 的前缀和减去以当前点为结尾的不合法区间个数,移项得到 \(pre_i = pre_j + k\),满足这个东西就是不合法区间,而且每个点只会对应一个不合法点值,开个 map 存 \(pre_j + k\) 即可。
AtCoder Beginner Contest 372
前两次好像忘记写了。
有点抽象,场上瞪了 40min F 不会做,看了 G 更没有可做性,直接颓了,前面的 E 还以为是找节点个数第 k 大的,没想到用 set 该怎么维护,然后手膜样例发现是编号(,卡了好久,光记录每个节点前 10 大的节点编号就没了,ABCD 都没什么好说的,这场还是唐。
Codeforces Round 974 (Div. 3)
1704 力,大喜。简单场,完成度 ABCDEFH,ABCDEF 都是无伤,赛后过了 H,我是真 nt,H 莫队的多测顺序清反了,导致 WA on #3,本来还能做 G 的。
A:一个计数器扫一遍就完了,没什么好说的。
B:发现奇\(\times\)奇\(=\)奇,偶\(\times\)偶\(=\)偶,所以判一下就行直接判断奇数个数就行。
C:无脑二分答案,找到最大值扔进去加然后判断。
D:大概就是给一堆线段,让你找一个长度为 \(d\) 的线段的最大覆盖数和最小覆盖数,这种东西典中典,区间左端点排序右端点树状数组,枚举一下答案线段然后动态加点就好了,复杂度 \(O(n\log n)\) 感觉会有线性做法。
E:直接分层图,拿有马的点往第二层连一下,第二层全是一半边权,然后起点终点分别跑一下最短路,枚举分割点就没了。
F:考虑 dp,设计 \(f(u,0/1)\) 表示 \(u\) 选/不选时候的最多金币数,然后枚举一下儿子判断 \(\max \left \{ f(u,1),f(v,1)+f(u,1)-2 \times c,f(v,0)+f(u,1)\right \}\),不选的时候直接加,就没了。
G:直接模拟,还没写,认为细节挺多。
H:注意到,如果选择的区间是偶数,那么 A 先手一定拿最大的,B 只能拿次大的,循环往复,B 的总和一定 \(\leq\) A 的总和,只有平局情况可能合法,奇数区间 A 一定多拿一个,一定不合法,然后就是判断两个区间每个数的个数是不是偶数了,直接莫队,复杂度 \(O(n\sqrt n)\),好像还有随机数的 \(O(n)\) 做法。
AtCoder Beginner Contest 374
上青第一场,唐的。
好久没更新了,一直是打完比赛就颓了。赛前 30 秒还没报上名,网还卡了,直接红温,晚了 1min 进场。过掉 ABC 之后发现 D 就是无脑装压转移,但是还要卡精度,所以扔掉看 E,看了半天 E,没理解题意,还因为没读完样例解释导致一直以为题目有问题,10 min 之后回头写 D,写的还算顺利,10 min 就写完一发过掉。然后回头发现 E 是自己样例解释没读完,发现就是一开始想的意思,一眼发现可以二分,然后发现选数量的过程不会做,发现如果直接做完全背包的话加剪枝是完全跑不满的,细算复杂度是 \(O(X \log X)\),然后写了 30min 因为 RE 挂了两发,就剩最后 10min 了,感觉 F 很可写,可是没时间了,唐完了。
好的,赛后补了 F,发现每个点只会向后移不超过 \(100\) 个 \(X\),然后直接转移,复杂度大概是 \(O(n^3)\)。
Codeforces Round 977 (Div. 2)
狗屎场,为什么连续几场都这么抽象。上蓝第二场,上一场好像忘记了,运气写了 ABCE。
这场 ABC1C2,E1 赛后 1min 过了,红温。
一眼出了 A 的结论,写了发现直接假掉,心态崩盘,20 min 之后写了式子,发现小到大排序依次合并最优,23 min 过 A,无敌了。B 题简单 trick,挨个看 \(\operatorname{mex}\),碰到有多余的按照 \(\bmod x\) 扔进 map
里面,然后遇到没有的点直接拿前面的往后面补。
C1 也简单,发现只要前面已经走了的人后面在什么位置出现都可以,否则就只能是在最前面,不然就是不合法的,依次判断就完了。C2 想了好久,自己真的唐丸了,发现上面的问题可以写作一个形式,我们将原序列重编号,然后给 \(b\) 序列编号,发现合法的要求就是所有编号第一个出现的位置单增,我们维护计数器表示当前数大于前一个数的数量,然后扔进 set
里面判断就好了,每次就是一个删除和插入操作,代码不难写。
E1 无脑 Floyd,然后对于对于每个点数,按照前一个的答案扩展,\(O(n^3)\) 暴力就够了。
差 D,E2,E3 未补。
AtCoder Beginner Contest 375
脑瘫场,被恶心到了。
30 min 过了 ABDE,然后看了一眼 F 觉得先把 C 写了比较好,然后就写了 50min,原因是一开始转四次转回来的思路被自己 hack 了,想骂人,然后剩 10min 发现 F 一眼题,然后赛后 3min 过了,红大温(
D : 简单数数,答案是 \(\sum \sum (i - j - 1)[a_i = a_j]\),对于每一个 \(a_i\) 值存一个 \(j+1\) 的和和已经记录了几个值,每次找到一个 \(i\) 就是乘上次数减掉之前的 \(a_j+1\)。
E : 简单 dp,设计 \(f_{i,j}\) 表示第一组的和是 \(i\),第二组的和是 \(j\) 的最小操作次数,这样我们就可以通过总和算出第三组和,然后统计一下初始值,挨个判断每个值变不变,怎么变就好了,复杂度 \(O(nV^2)\),\(V\) 只有 \(1500\)。
F : 一眼题,删边操作反过来变成加边操作,发现 \(n\leq 300\),直接 Floyd 就好了,可是加边再 Floyd 是 \(O(n^4)\) 的,考虑每次加一条边最短路的答案变动只有经过新加边的两个点的,所以外层枚举中转点没有必要,复杂度 \(O(n^3)\),没有 \(m\) 是因为加边操作只有 \(300\) 次。