比赛日志

Codeforces Round 968 (Div. 2)

完成度 4/7,我的 D2 啊啊啊啊啊啊啊。

A:发现只需要关注字符串的开头结尾是否一样,因为只要中间有不同的字母就可以分出两段来,而大字符串的开头结尾是必选的,判断即可。

B:一眼以为博弈,转换一下题意就是小A每次删掉一个最小值,小B每次删掉一个最大值,小A先手,为最后剩下的数最大是多少,这个显然就是中位数,直接输出。

C:猜结论,考虑一个位置让他匹配的个数尽可能多,就让中间相同字符出现的时刻尽可能晚,那么就每次尽可能放与上一次不同的字符即可,记个数,直接输出。

D1:艹,调代码卡我半天,考虑一个序列最多只会进行两次操作,也最多只会存在两个不同的 mex,可以直接建图广搜倒着跑,给每个点更新最大值即可,最后还要处理那些取自己为最大值的点即可。

D2:感觉跟 D1 差不多,只是上面的边变成了你只能选择一条,换句话说,假如两个 mexxy,那么你要么把当前数变成 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()+2

  • 假设根未确定,且我们不拿根,让对面拿根,则答案是 min()+(=22)

  • 否则,就是根已经确定了,假设这个根是白的,那么答案是 +2)

  • 还有就是根是黑的的情况,答案是 +2)

以上仅为本人赛时口胡,不保证完全正确,等代码确定正确之后会删除本行。

E : 树按照 dfs 序排列是个重要性质,我们就可以直接预处理所有节点到下一个点的距离,然后能发现,只要一条路径上还有未确定的点,那么我们就可以把所有未定的点值全部放过去,然后取个最大次大,分类讨论看看次大是不是放在交叉路径更好就行了,未补代码,不完全保证正确性,保证之后会删掉本行。

2F 待补,div 1 待补。

Codeforces Round 970 (Div. 3)

完成度 6/8,又是 nt 场,耶。赛后 10min 才过 G。

A ~ F 都无伤的 (。

A:ab 都为偶一定可以正负正负全消掉,只有 b 为奇数可以拿两个 1 消掉,判断即可。

B:判断大小之后,按照题目给的标号方法依次判断每一行即可。

C:公差一定是一个 1234... 的数列,直接算就行了,不会超过 5e4。

D:上上次 abc 的类似题,每个连通块是个基环树,并查集存大小直接算。

E:抽象题,场上卡我 50min,唐完了。预处理前后缀字母个数,判断需不需要删除,然后连接前后缀拿出现最多的字母算操作次数即可。

F:答案的分子是 i=1n(ai×j=i+1naj),处理后缀和直接算。

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 : 写出转移式子 fi=j=1ifj×[preiprejk],其实就是 fi 的前缀和减去以当前点为结尾的不合法区间个数,移项得到 prei=prej+k,满足这个东西就是不合法区间,而且每个点只会对应一个不合法点值,开个 map 存 prej+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:发现奇×=奇,偶×=偶,所以判一下就行直接判断奇数个数就行。

C:无脑二分答案,找到最大值扔进去加然后判断。

D:大概就是给一堆线段,让你找一个长度为 d 的线段的最大覆盖数和最小覆盖数,这种东西典中典,区间左端点排序右端点树状数组,枚举一下答案线段然后动态加点就好了,复杂度 O(nlogn) 感觉会有线性做法。

E:直接分层图,拿有马的点往第二层连一下,第二层全是一半边权,然后起点终点分别跑一下最短路,枚举分割点就没了。

F:考虑 dp,设计 f(u,0/1) 表示 u 选/不选时候的最多金币数,然后枚举一下儿子判断 max{f(u,1),f(v,1)+f(u,1)2×c,f(v,0)+f(u,1)},不选的时候直接加,就没了。

G:直接模拟,还没写,认为细节挺多。

H:注意到,如果选择的区间是偶数,那么 A 先手一定拿最大的,B 只能拿次大的,循环往复,B 的总和一定 A 的总和,只有平局情况可能合法,奇数区间 A 一定多拿一个,一定不合法,然后就是判断两个区间每个数的个数是不是偶数了,直接莫队,复杂度 O(nn),好像还有随机数的 O(n) 做法。

AtCoder Beginner Contest 374

上青第一场,唐的。

好久没更新了,一直是打完比赛就颓了。赛前 30 秒还没报上名,网还卡了,直接红温,晚了 1min 进场。过掉 ABC 之后发现 D 就是无脑装压转移,但是还要卡精度,所以扔掉看 E,看了半天 E,没理解题意,还因为没读完样例解释导致一直以为题目有问题,10 min 之后回头写 D,写的还算顺利,10 min 就写完一发过掉。然后回头发现 E 是自己样例解释没读完,发现就是一开始想的意思,一眼发现可以二分,然后发现选数量的过程不会做,发现如果直接做完全背包的话加剪枝是完全跑不满的,细算复杂度是 O(XlogX),然后写了 30min 因为 RE 挂了两发,就剩最后 10min 了,感觉 F 很可写,可是没时间了,唐完了。

好的,赛后补了 F,发现每个点只会向后移不超过 100X,然后直接转移,复杂度大概是 O(n3)

Codeforces Round 977 (Div. 2)

狗屎场,为什么连续几场都这么抽象。上蓝第二场,上一场好像忘记了,运气写了 ABCE。

这场 ABC1C2,E1 赛后 1min 过了,红温。

一眼出了 A 的结论,写了发现直接假掉,心态崩盘,20 min 之后写了式子,发现小到大排序依次合并最优,23 min 过 A,无敌了。B 题简单 trick,挨个看 mex,碰到有多余的按照 modx 扔进 map 里面,然后遇到没有的点直接拿前面的往后面补。

C1 也简单,发现只要前面已经走了的人后面在什么位置出现都可以,否则就只能是在最前面,不然就是不合法的,依次判断就完了。C2 想了好久,自己真的唐丸了,发现上面的问题可以写作一个形式,我们将原序列重编号,然后给 b 序列编号,发现合法的要求就是所有编号第一个出现的位置单增,我们维护计数器表示当前数大于前一个数的数量,然后扔进 set 里面判断就好了,每次就是一个删除和插入操作,代码不难写。

E1 无脑 Floyd,然后对于对于每个点数,按照前一个的答案扩展,O(n3) 暴力就够了。

差 D,E2,E3 未补。

AtCoder Beginner Contest 375

脑瘫场,被恶心到了。

30 min 过了 ABDE,然后看了一眼 F 觉得先把 C 写了比较好,然后就写了 50min,原因是一开始转四次转回来的思路被自己 hack 了,想骂人,然后剩 10min 发现 F 一眼题,然后赛后 3min 过了,红大温(

D : 简单数数,答案是 (ij1)[ai=aj],对于每一个 ai 值存一个 j+1 的和和已经记录了几个值,每次找到一个 i 就是乘上次数减掉之前的 aj+1

E : 简单 dp,设计 fi,j 表示第一组的和是 i,第二组的和是 j 的最小操作次数,这样我们就可以通过总和算出第三组和,然后统计一下初始值,挨个判断每个值变不变,怎么变就好了,复杂度 O(nV2)V 只有 1500

F : 一眼题,删边操作反过来变成加边操作,发现 n300,直接 Floyd 就好了,可是加边再 Floyd 是 O(n4) 的,考虑每次加一条边最短路的答案变动只有经过新加边的两个点的,所以外层枚举中转点没有必要,复杂度 O(n3),没有 m 是因为加边操作只有 300 次。

Codeforces Round 1004 (Div. 2)

我竟然还会滚回来更新这个,简单场,场上写了 ABCD,赛后补 EF,这把属于是唐完了。

A:观察得 x=y1 或者 xy=8+k9,能够成立,枚举判断即可。

B:放到值域上,顺着推,如果 ci=1,则表示无解,因为无法使两个袋子同时拥有,否则 ci>1,留两个分在两个袋子里,剩下的往后面扔,模拟即可,正确性显然。

C:暴力模拟,因为数位长度只有 10,暴力枚举加几个 9,每次 check 是否有 7 就好了。

D:交互好玩!因为只有两次询问,显然询问 i jj i 最优,对于 B 方案,两个询问得到的答案一定相同且不为 0,对于 A 方案,我们肯定要使两点的最短路长度是一样的,那么我们至少需要 ans×2 条边才能实现,这里 ans 是询问得到的答案,此时我们分类讨论,假设 x 序列不是一个排列,说明有点没有出边,则这点到任何一点的最短路长度为 0,找到这个点随便问就好了,那么当 x 为一个排列时,因为需要 ans×2 条边,我们直接询问 1n,在 y1yn 相等的情况下,也至少需要 2×n2 条边才能使 AB 的答案一致,这个显然是做不到的,判断 ans 是否小于 |xixj| 就好了。

E:唐题,赛时 40min 没想出来,看了题解发现想多了。首先有一个结论,子序列中有两个 0 时这个子序列一定不合法,取靠前的那个 0 的位置就行了,此时 min=0mex=1,子序列中没有 0 的话这个子序列一定合法,这个就是显然了,所以我们此时有一个答案 nc0,其中 c0 表示 0 的个数。考虑只有一个 0 的情况,当 i 取在 0 后面的位置时,min=mex=0,子序列显然合法,所以我们只要让 i 前的 min 大于 imex 就好了,这样的话,显然我们取最靠左的一个 0 是最优的,证明很简单,所以我们直接把所有不为 0 的数取出来和唯一一个 0 拼成一个序列直接挨个判断就好了,复杂度 O(n),如果合法,此时答案为 nc0+1

F:抽象题,赛时没仔细读题,还是挺简单的。我们令 pi 表示 i 位置的前缀和,因为 PQR 至少有一对相同的,所以 PQR=pi,基于这个,我们设计 fi,x 表示到第 i 个位置,相同的两个位置的权值是 x 的方案数。考虑转移,对于一个数对 (pi,x,x),上一个数对可能是 (pi,xai,x) 或者 (pi1,x,x)。对于第一种,因为要求前一个数对也至少有俩相同的,所以 x=pi1 或者 x=pi,第二种的答案也是 x=pi 的答案,所以我们令 fi,pifi1,pi。对于 x=pi1,我们的上一步可能从 (pi1,pi1,pi1) 转移而来,这样就有三种,也可能从 (pi,pi,pi1) 转移而来,这个数对也可以交换顺序,这样只能从两个 pi 的里面选择一个,所以只有两种方法,故有转移 fi,pi1=3×fi1,pi1+2×fi1,pi,滚动数组压掉空间,再拿 map 当做 f 数组存下标就好了,离散化好像有点麻烦,没写出来。

posted @   Wei_Han  阅读(58)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示