Codeforces 记录
Codeforces 记录
CF1509(Div.2)
场上通过:\(A\ 1B\ 1C\) \(\texttt{rk}1614\)
A:4min B:33min C:74min
BC用时太久,考场上最后15min对D中给出3个2n串条件不会用
就去看E,最后大概会E,但没有时间写
改题进度:DE
D
仅需考虑对于一个长度为2n的01串,必有一个字符出现了至少n次,称该字符为其特征字符
三个2n串中必有两个的特征字符相同,将这两个串拿出来构造下就行了
E
考虑1~n总共有多少个满足条件的排列,简单推推可以发现即为 \(2^{n-1}\)
考虑按位确定排列,随便写下即可
CF1517(Div.1+Div.2)
场上通过:\(A\ B\ C\ D\) \(\texttt{rk}1070\)
A:4min B:16min C:39min D:49min
考场上最后3min写完了E题,但还没调完,考后调完了E
E题场上没过还是挺可惜的,过了就上大分了
发现CFdiv.2E我永远过不了/kk
改题进度:E
B
考场胡了一个每次降序把值分配给升序的最小值序列
标算是考虑将全局最小的 \(m\) 个数分别分给 \(m\) 个方案即可
C
考场上猜了个写法,大概是从前往后扫排列,每次尽量往左边填
对每一行维护一个已填到哪里的轮廓线,新一个位置沿轮廓线填
这个做法大概是标算的构造2
D
首先考虑 \(k\) 为偶数
显然路径不会是一条环路,一定是到某个点后原路返回
然后对于每个点bfs一次即可
这个算法的时间复杂度为 \(O(nm4\sum_{i=1}^{\frac k 2}i^2)\)
大概接近 \(4\times 10^8\) 次运算,考场上过了
事实上,标算给出了一个 \(O(nmk)\) 的做法
考虑dp,记 \(f_{x,y,k}\) 表示 \((x,y)\) 走 \(k\) 步的最短距离
转移很显然 \(f_{x,y,k}=\min_{(u,v,x,y)}\{f_{u,v,k-1}+w_{u,v,x,y}\}\)
大概比考场上的弱智东西好写点
E
考场上直接大力讨论
注意到连续的 \(C\) 或 \(P\) 十分特殊,讨论从C段与P段的角度出发
-
不存在C/P段
则仅可能为 \(PCPCPC...\) 或 \(CPCPCP...\)
-
存在C段且不存在P段
C段左边最多填一个 \(P\) 右边只能若干 \(PC\) 反复
-
存在P段且不存在C段
类似 Case2
-
C/P段均存在
P段在C段前当且仅当两段之间无其它且左右均无其它
C段在P段前则两段中间可填若干 \(PC\) ,最左最多一个 \(P\),最右最多一个 \(C\)
实现的话Case1,2,3都是 \(O(n)\) 的
Case4能二分一下,总复杂度 \(O(nlogn)\)
大概能双指针做到 \(O(n)\)
CF1519(Div.2)
场上通过:\(A\ B\ C\ D\) \(\texttt{rk}1048\)
A:6min B:14min C:25min D:15min
大概是手速场,E最后div2过了7个人
AB题速度都太慢了,罚时严重
改题进度:E
E
容易想到对于一个点有两个关键值:\(\frac y{x+1},\frac{y+1}x\)
若两点任意关键值相同,即可匹配
正解做法考虑离散化所有关键值后两两关键值连边,形成若干连通块
显然,不同连通块间无影响,考虑一个单独的连通块
取出块中的一颗生成树,其仅存在返祖边
首先,考虑没有返祖边的情况,我们容易得到一种至多一条边未匹配的算法,显然最优
目前我们试图解决子树 \(x\) 内的边匹配情况,递归其儿子 \(y\)
若 \(y\) 子树中有一边未匹配完全,将其与 \(x\to y\) 匹配,否则我们留下了 \(x\to y\)
所有子节点递归完成后,将剩下的 \(x\to y\) 边两两匹配即可
对于返祖边,我们将其放在祖先节点考虑,相当于多了一个叶节点连接 \(x\)
做法几乎同上
CF1515(CGR14)
场上通过:\(A\ B\ C\ 1D\) \(\texttt{rk}1267\)
上 \(\color{purple}{\text{Candidate Master}}\) 了!
A:5min B:4min C:13min D:47min
C题用时偏久,D题用时过久了,手速一般
改题进度:EF
E
考虑到手动开启的电脑形如若干仅空1个的连续段
考虑一个长度为 \(k\) 的连续段的方案数,容易得到其为 \(2^{k-1}\)
我们仅需以组合数合并若干个连续段即可得到答案
记 \(f_{i,j}\) 表示长度为 \(i-1\) 的序列,有 \(j\) 个位置手动开启的方案数
\(f_{i,j}\tbinom{j+k}k2^{k-1}\to f_{i+k+1,j+k}\)
转移即可,时间复杂度 \(O(n^3)\)
F
考虑判断无解
显然,若 \(a\) 值总和小于 \((n-1)*x\),显然无解
否则,我们这样一个构造方案
取全局最大的 \(a\),随意找一个邻居与其合并,并重复此操作 \(n-1\) 次
对于一次操作,若 \(maxa\geq x\) 显然正确,否则,所有 \(a_i<x\)
若存在 \(a_i+a_j<x\),则 \(\sum_{i}a_i<(n-1)*x\),不符合原先假设
故该策略正确,写个优先队列即可
CF1549(Div.2)
前面应该少写了几场CF的总结,目前已经掉紫了/kk
场上通过:\(A\ 1B\ C\ 1D\) \(\texttt{rk}314\)
A:5min B:17min D:20min C:47min
感觉逐渐没有手速,C题一开始甚至不会,就赶紧去看D把D写了,感觉C非常sb
不懂为啥自己第一眼不会做
E题是个降智题,想到了思路边边上,没有仔细把递推的思路浮出水面,亏麻了,场上只有20人通过了E
改题进度:E
CF1559(Div.2)
又上 \(\color{purple}{\text{Candidate Master}}\) 了(
场上通过:\(A\ B\ 3C\ D_1\ E\) \(\texttt{rk}285\)
A:7min B:9min C:21min D1:14min E:31min
手速慢得可怜,C题还罚了三次时,明明都是很简单的情况但是由于急躁没考虑到
打比赛心一定要定,不要慌乱
D2
考虑将点 \(x\) 归成若干个形如 \((i,j)\) 的集合
表示点 \(x\) 在第一片森林中的第 \(i\) 个连通块与第二个森林中的第 \(j\) 个连通块
显然我们要做的是找到 \((a,b),(c,d)\) 两个集合,满足 \(a\neq c,b\neq d\) 且两集合不为空
我们将 \((i,j)\) 视为网格图上的点
我们不妨一开始钦定行数不多于列数
如果存在一行有至少2个格子不为空,那么再随便找一行就能找到一条新边
如果所有行上的格子都只有一个不为空,那么由于行数不多于列数,此时两两行上所不为空的列互不相同
我们考虑维护行上不为空的列集合,与列上不为空的行集合
每次取出集合最大的两行,挑出其中的两列,进行启发式合并
时间复杂度 \(O(n\log^2n)\)
CF1562(Div.2)
场上通过:\(A\ B\ C\ D_1\ D_2\) \(\texttt{rk}211\)
A:4min B:18min C:31min D1:52min D2:14min
没有一题手速过关,非常谨慎的保持了没有罚时
对 \(D\) 的结论太不熟练,爬了,被 xzy 鸽鸽点醒后才过
改题进度:E
E
考场上只有10min看这题,很简单编了一个 \(O(n^2\log n)\) 做法,没有考虑到字符串序列的特殊性质
考虑串最长上升子序列的形式
结论是如果 LIS 中存在 \([l_1,r_1]\),那么 \([l_1,i]\ (i\in[r_1,n])\) 均存在一定不劣
考虑证明:
如果 LIS 中间两项形如 \([l_1,r_1],[l_2,r_2]\ (r_1\neq n,l_1<l_2)\)
此时由于后者比前者的字典序大,有两种情况
-
\(r_1-l_1+1>r_2-l_2+1\)
此时显然后者的字典序也会大于 \([l_1,i]\ (i\in(r_1,n])\),直接将这部分加入即可,答案显然更优
-
\(r_1-l_1+1\leq r_2-l_2+1\)
考虑 \([l_1,n]\) 的字典序是否小于 \([l_2,n]\) 的字典序
如果不是,显然 \([l_1,r_1]\) 为 \([l_2,r_2]\) 的某个前缀,将 \([l_1,r_1]\) 用 \([l_2,l_2+r_1-l_1]\) 替代,答案不劣
如果是,\(r_2\) 如果不在 \(l_2+\text{LCP}(l_1,l_2)\) 之前,显然 \([l_1,i]\ (i\in(r_1,n])\) 直接加入
否则,考虑 \(r_1\) 和 \(r_2\) 同时执行若干次后移,答案不劣,直到 \(r_2\) 达到 \(l_2+\text{LCP}(l_1,l_2)\)
变成前一种情况
此时直接 dp 即可
时间复杂度 \(O(n^2)\)
CF1556(Div.1+2)
场上通过:\(A\ B\ 1C\ D\ F\) \(\text{rk}403\)
上 \(\color{orange}{\text{Master}}\) 了!
A:4min B:9min C:27min D:33min F:58min
C的速度太慢了还因为没开 ll 罚了一次时
D在场上的做法并非最简单的做法,用时较久,实际上考虑 \(a+b=(a\&b)+(a|b)\) 就能快速通过此题
过完 ABCD 后,发现 hh 17min过 F 就去跟榜,感觉确实不难但用时很久
最后 10min 加班不出 E,然后就跑路了
改题进度:E
E
考虑记序列 \(c\),满足 \(c_i=b_i-a_i\)
原操作相当于在 \(c\) 上对于一个长为偶数的子序列做 \(-1,+1,\cdots,-1,+1\) 操作
最终要求 \(c\) 序列某段区间全为 0 的最小操作次数
由于做一次操作后序列总和不会改变,观察到区间 \([l,r]\) 能由操作变为 0 至少满足 \(\sum_{i}c_i=0\)
我们如果把正数 \(x\) 看成 \(x\) 个左括号,负数 \(y\) 看成 \(|y|\) 个右括号
我们的操作等价于任选括号序列里的一个形如 \((\ )(\ )(\ )\cdots\) 的子序列删去
由于只能删去一个合法括号序列,原序列也一定为合法括号序列才能有解
结论是最小操作次数为括号序列前缀最大左括号剩余值
考虑归纳证明
我们首先将括号序列分为 \((\cdots)\) 和 \((\cdots)(\cdots)(\cdots)\) 型两种
对于后者,其最小操作次数显然为每一段合法括号序列答案的最大值
等价于前缀最大值,我们考虑第一种情况即可
显然,大小为 2 的合法括号序列满足此结论
若长度小于 \(n\) 的合法括号序列均满足此结论
对于一个长度为 \(n\) 的形式1型合法括号序列
我们先将其最外的一层括号拨开,里面一定是一个 \(n-1\) 层的形式1型序列或者一个形式2形序列
有归纳可知,这部分的答案为前缀最大值,记其为 \(s\)
又因为最外层的一对括号没法和任意一对括号在同一次操作里被消除
最终这个序列的答案应该为 \(s+1\)
最外一层括号对前缀和的影响相当于整体加一并在最末尾补0,最大值将变为 \(s+1\)
满足,故归纳成立
得到结论后,我们仅需维护前缀最大/小值即可,可以线段树/st表解决
时间复杂度 \(O(n\log n)\)
CF1569 (ECR133)
场上通过:\(A\ 2B\ 1C\) \(\texttt{rk}1544\)
A:3min B:16min C:21min
小号打的,自大闭场
B 和 C 的罚时比较发憨:
B 没处理 2 个 2 的情况,感觉属实没状态;看到 C 一眼秒了之后最大值次大值求措了(
40min 以后看 D,一眼觉得自己会了,怎么调样例一第二个答案都是 8,场上人都傻了
最后 10min 的时候发现最开始的结论不对,白搞了,心态炸了
第二天下午想了想正确的 D 咋做,感觉比场上的我的假做法容易了挺多
/tuu
发现 E 直接meet in middle 就能过,非常 naive,但好像有高妙做法(
改题进度:DE
CF1566(CGR16)
时逢开学前一晚,正好下分成 \(\color{purple}{2099}\)
可谓是影响了开学第一天,又下成 CM,输光了
场上通过:\(A\ B\ C\ D_1\ 1D_2\ E\)
A:8min B:8min C:9min D1:8min D2:30min E:77min
手速极慢,感觉但凡A题快点过掉就不会下 M\tuu
D2 因为一次边界问题贡献了一发罚时
E 题在 CXY 神仙的教导下得到了 std 做法,写了一年终于过了
考场上我们对 E 的正确性存疑,想着反正不过 E 今天得下大分,不如冲一下可能还有减少损失的可能
考后觉得正确性很对(
CF1580(Div.1)
赢麻场,上 \(\color{orange}{\text{International Master}}\) 了
场上通过:\(A\ C \ 1D\) \(\text{rk}41\)
被 skydogli 带飞,隔壁学长们迅速切 \(D\) 后一度形成 \(rk7,8,9\) 在同一个机房的壮阔场景(
感觉中国场对中国人确实友好
考场上 \(B\) 大概会一个基于笛卡尔树的奇怪的 \(n^5\) 做法,没梦想就没 rush 了,最后 \(B\) 只要把 dp 值为 0的转移跳过就能过了
大概大号一段时间不会使用?感觉接下来怎么打怎么掉分(
orz \(\color{red}{\text{Grand Master}}\) huangzirui