Pupil 计划试题乱做 Part 1

菜死了,jujucxy 都是 GM 计划,就我是 Pupil 计划/ll。

争取 CF 上 Pupil!

01 CF1295E Permutation Separation

热身题,*2200,大概花了 10min 不到。

从小到大枚举值域的分割点,那么容易发现一个前缀代表的代价就是这个前缀在分割点后的数代价之和加上对应后缀在分割点前的数代价之和,容易发现可以用线段树维护。

代码暂时鸽了。

02 CF1418G Three Occurrences

提升了一点难度就不会做了,我是傻逼,*2500。

可以得到一个做法:枚举右端点,容易知道一个数字会对左端点所在区间进行限制,然后用线段树维护 min/max 暴力跳区间,但好像这是平方的。

看了题解得知有两种做法。

第一种是考虑列一个表,第 \(i\) 行 第 \(j\) 列表示 \([j,i]\) 是否合法,然后可以发现去除不合法区间可以使用矩形并来实现,扫描线可以做到 \(O(n\log n)\)

具体地,叉的方式:①区间为空②区间某个数出现次数非零且小于 \(3\)③区间某个数出现次数大于 \(3\)

第二种比较简单,考虑两个前缀代表的区间合法的条件就是每个数出现次数相减 \(=0/3\),于是可以对于前缀出现次数模 \(3\) 哈希,然后再通过双指针强制那个三的倍数 \(=3\)

代码暂时鸽了。

03 CF1209F Koala and Notebook

这个我会啊,*2600 难度名不副实啊。

首先把一个数字拆成若干个个位数,组成的数字最小可以转化成长度最小的同时字典序最小,那么第一个限制跑最短路生成一个分层图,然后再在这个 DAG 上贪心取就好了。

代码上好像有些许细节,所以代码暂时鸽了。

04 CF1527D MEX Tree/CF990G GCD Counting

都是 *2400。

后面一道题目之前做过,但是忘了(

回忆了一下发现后面那道题大概会了,首先对于每个数把它倍数的边取出来,可以很简单通过并查集计算出 \(\gcd\) 是它倍数的答案,那么之后容斥即可。

然后是前面那道题,一条链的情况做法很显然,考虑不是链的情况。

实际上我们只需要判断出哪一刻 \(0,1,\cdots,k\) 在树上没有形成链即可,按照 dfn 序维护一个 set,每次查看它的前驱后继与它是否共链就好了。

看了题解之后发现做法麻烦了一点,只需要判断是否在链两端的路径上就好了,但是上述做法也能通过。

代码暂时鸽了。

一个变形:

改为 \(\text{xor}\) 怎么做:预处理每个点到根的异或和,做一遍异或卷积即可。

05 CF1327G Letters and Question Marks

*2800 的题,之前做过现在却不会了,麻了。

看了一眼题解,原来是看错数据范围了/ll。

首先有一个比较劣的 \(O(n2^cc\sum|t|)\) 的 ACAM 上 dp 做法,设 \(f_{i,j,k}\) 表示前 \(i\) 个字母,ACAM 上匹配到 \(j\)\(k\) 为使用过的字母的状态的最小代价。(这个是自己想到的)

考虑怎么优化,由于问号数量很少,而且问号之间的部分都是确定的,所以考虑只 dp 问号内容,即 \(f_{i,j,k}\) 表示前 \(i\) 个问号,ACAM 匹配到 \(j\)\(k\) 为使用过的字母的状态的最小代价,那么可以预处理一下 ACAM 每个结点开始连续一段的行走终点,这样的复杂度为 \(O(n\sum|T|+2^cc^2\sum|t|)\),仍然无法通过。(这个是不小心瞄到后想到的)

实际上使用过的字母的状态的 \(1\) 个数就是填充的问号个数,这样就砍掉了一维,可以通过。(这个是没想到的/ll)

代码暂时没调。

不应该看着 *2800 就不仔细想

06 CF1205D Almost All

*2700,又不会做,自闭了。

CF1205D Almost All 解题报告

07 CF513E2 Subarray Cuts

咕着呢。

*2700

08 CF1379F2 Chess Strikes Back (hard version)

咕着呢。

*2800

09 CF1381C Mastermind

咕着呢。

*2500

10 CF1458C Latin Square

之前看过做法的 *2700,不知道再做一遍还会不会。

回忆了一下,想起来了(

对于每个位置维护三元组 \((x,y,z)\) 表示横纵坐标以及权值。

UDLR 等价于取模下给 \(x-1,x+1,y-1,y+1\),IC 就等价于交换 \((y,z)\) 或者 \((x,z)\)

记录一下当前 \((x,y,z)\) 的顺序即可,复杂度 \(O(\sum(n^2+m))\)

AC 记录

11 CF1601E Phys Ed Online

骨折呢。

*2900

12 CF1584F Strange LCS

考试中没有做出来的 *2600,现在还是不会做,有什么长进呢。。。

首先考虑每种字母只出现一次的答案,可以发现我们设 \(f_i\) 为钦定以字母 \(i\) 结尾的 lcs 长度,\(p_{i,j}\) 为字母 \(i\) 在字符串 \(j\) 的位置,那么 \(f_i\) 只能从 \(\forall_k p_{j,k}<p_{i,k}\) 的字母转移过来,于是我们就有了一个转移顺序,直接 dp 即可。

如果每种字母出现两次,我们观察 \(n\) 很小,于是考虑状压上一次选择的字符是用的第一/二个出现位置,然后类似转移就好了,细节较多,很难考虑。

时间复杂度 \(O(|\Sigma|^22^nn)\)

AC 记录

13 CF1400G Mercenaries

一个比较简单的 *2600?

首先考虑容斥,枚举边集表示必选这些边,然后你就可以得到一个最终人数的约束区间。你枚举最终人数,那么就可以得到能用的人数,直接组合数硬上就可以了。

但是枚举最终人数的复杂度承受不了,我们把式子列出来观察:

\[\sum_{i=L}^R {ok_i-tot\choose i-tot} \]

其中 \(ok_i,tot\) 分别表示最终人数为 \(i\) 可用的人数、边覆盖的人数,我们发现 \(tot\) 很小,于是我们可以对于每个 \(i\) 可以预处理一个小范围的前缀和。

时间复杂度 \(O(2^m+nm)\)

AC 记录

14 CF67C Sequence of Balls

*2600

Give up 了,太难了/ll。

15 CF1153F Serval and Bonus Problem

*2600

鸽了。

16 CF1168D Anagram Paths

*3000

首先所有叶子节点深度相同。

大概就讨论一下 dfs 序相邻的叶子之间的路径情况?=>实际上这个条件不明不白,应该是每个点向下延伸的所有路径每个字符出现次数最大值之和不超过 \(x\) 向下延伸的链长度。

\[\forall x,\sum_{i=1}^{|\Sigma|}mx_{x,i}\leqslant len_x \]

重排度应该就是出现了的字符的贡献加上 \((1+2+\cdots+26)x\),其中 \(x\)\(len_1-\sum_{i=1}^{|\Sigma|}mx_{1,i}\)

然后考虑怎么修改。

很容易想到(确实想到了)将叶子节点的虚树提取出来,然后就不会做了。

实际上这个树高是根号的,原因是所有叶子深度相同,然后考虑树高那一条链必须要延伸出长度的平方级别个点。

这样暴力修改就好了,时间复杂度 \(O(n|\Sigma|+q|\Sigma|\sqrt n)\)

17 CF1400F x-prime Substrings

就这种题还有 *2800 难度?秒了。

由于 \(x\) 很小,考虑 \(x\) 能生成的 x-prime 串数量很少,实验证明不超过 \(3000\)

然后就把这些串建 AC 自动机后直接 dp 就好了。

AC 记录

原文地址:https://www.cnblogs.com/xiaoziyao/p/15679116.html