2023做题记录
本文同时发表于个人洛谷博客。
部分收录于构造题部分。
2023.11.3
Luogu P2467
上一次CF就是被这个trick坑了!/ng
用 \(dp_{i,j,k}\) 表示第 \(i\) 个在前 \(i\) 个中的位置为 \(j\) 时的方案数,\(k=0\)表示是山谷,\(k=1\) 表示是山峰,显然可以写出转移方程:
前缀和加滚动数组即可。
CF1761D 2100
小清新题。
考虑连续进位串。发现除了第一位必须要选择 (1,1),其他都可以任选(0,1),(1,0),(1,1)。
中间必须用(0,0)隔开。讨论连续段个数即可。时间复杂度 \(O(k\log n)\),可以做到 \(O(k)\)。
2023.11.6
abc302h 空心橙
先考虑单个问题。每次操作在两点之间连边,发现对于每个联通块,如果是一颗树则是树的大小-1,否则为联通块大小。
用可撤销并查集维护即可,时间复杂度 \(O(n\log n)\)。
arc084b 空心橙
据说德文以前还布置过这题/yun
用十进制从低位到高位考虑,发现有贡献的只有前5个数。直接用前5个数记录状态,可以跑最短路,时间复杂度 \(O(n \log n)\)。
CF1027E 2100
真不知道怎么评到紫的。
考虑每一行最大联通块个数,显然可以 \(O(n^2)\) dp解决,扫描所有个数,计算其同时选择一种方案时的次数。
这难度最多蓝吧。
2023.11.7
CF1342E 2300
不会斯特林数。
发现两两攻击的次数其实就是给出了所有车可以放的行数,因此转化之后变成
其实我是推了半天\(dp_{i,j}=dp_{i-1,j-1}+j\times dp_{i-1,j}\)之后崩溃了查oeis发现是斯特林数
直接解决即可。
CF1144G 2400
水题。
一眼考虑dp,设 \(dp_{i,0}\) 表示单增序列的结尾是 \(i\) 时单减序列最大的最小值,\(dp_{i,1}\) 表示单减序列的结尾是 \(i\) 时单增序列最小的最大值,转移时考虑在当点前的连续单增或单减序列进行转移即可,时间复杂度 \(O(n)\)。
CF1758E 2500
我是傻逼。
发现有解情况只需在矩阵中每一列中已确定的行之间连边,答案即为 \(k\) 的联通块个数减一加上没有确定任何一个数的列个数次方。
考虑无解情况,梦魇的开始
对于每一行之间以其与之前的点以权值差连双向边,直接判断是否合法,正确性易证。
/fn/fn/fn
2023.11.9
CF1681E 2600
看到分层自然想到倍增。
用 \(dis_{i,stat_1,stat_2,j}\) 表示从第 \(i\) 层的上门或右门到第 \(i+2^j\) 层的上门或右门,显然可以倍增转移。
操作时直接跳即可,时间复杂度 \(O(n \log n)\)。
CF1260E 2400
抽象。
观察题面,发现样例很弱。
大胆猜想最后一个必须选,然后剩下的从小到大选取,一定能选 WA on #13。
仔细思考,发现有时会出现选择的点活不到贿赂的时候,因此考虑每个点能活到的时刻,发现就是 2 的幂次。
直接从右往左丢进堆里选即可。
2023.11.15
vp CF1704 CodeTON2
打的最抽象一场。
ABC都是水题,但一共吃了三发,不写了。
D 1900
诈骗。
考虑怎样的两个序列经过变换1是同样的,发现可以 \(O(n)\) 扫描,计算下一个数的变化量,如果为 \(0\) 就相同,否则不同。
直接 \(O(nm)\) 暴力过题。
卡了一个小时/ll
E 2200
一眼题。
看到dag自然考虑dp。发现可能会有一个点传下来的时候这个点的权值是0的情况,但是显然该情况只出现在前 \(n\) 个时刻中,因此我们用 \(stat_{i,j}\) 表示在前 \(n\) 个时刻中第 \(i\) 个点在第 \(j\) 个时刻是否会往下流, \(dp_i\) 表示第 \(n\) 个时刻后有多少时刻第 \(i\) 个点会往下流,容易写出转移方程。
把 \(nxt\) 打到 bool 里面调了二十分钟/ll
时间复杂度 \(O(n\sum n)\)。
2023.11.16
arc071d 实心黄
诈骗。
发现如果直接dp状态非常不优,考虑一些玄学做法。
发现最终序列无论如何一定是一堆1中间夹杂着几个别的数和后面的一长串,直接 \(O(n)\) dp 即可。
、
arc102c 铺底橙
过于shaber题,感觉没有2500。
直接考虑对某一个和无法出现的本质,发现即为某一个数至少出现1次(这种情况最多只会出现1次)或两种点色中最多出现一种。先考虑第二种,显然可以 \(O(n)\) 单次解决,而第一种可以直接拆成两次操作,直接相加即可。
时间复杂度 \(O(nm)\)。
arc087c 空心橙
相比前一题还算正常。
看到01串,有大小限制,自然想到建01Trie。
可以发现新放的串就是一个点都没被填的子树。
考虑 SG 函数,发现就是子树深度的 lowbit。
直接dfs即可,时间复杂度 \(O(\sum len_{i})\)。
2023.11.20
Luogu P2463 (BZOJ4698)
SA板题。
差分之后变成所有字符串的最长公共子串,考虑SA。
跑出 height 数组之后发现可以双指针,时间复杂度 \(O(n \log n)\)。
Luogu P4341 (BZOJ2251)
又是降智的一天呢/fn
写了一个奇怪的unordered_map
和priority_queue
发现有点卡空间。
然后就不会了qaq
发现排序之后 height 以内的已经被跑完了,直接一次双指针询问完。
时间复杂度 \(O(n^2)\)。
2023.11.21
Luogu P4248 (BZOJ3238)
拆柿子,发现变成一坨直接算的东西加上所有后缀的 lcp。
考虑拆贡献计算。
tj用的单调栈,但是我太蠢了,于是我用了set
但是时间复杂度不劣,仍然是 \(O(n \log n)\)。
2023.11.22
arc128d 半空心橙
非常at风格的dp。
考虑无法合并的情况,显然只有两种:两个数字一直交替,某一个数字连续出现。
将两种情况分开考虑。第二种可以直接断开,第一种dp时处理,很好写出转移方程。
时间复杂度 \(O(n)\)。
2023.11.23
abc290g 空心橙
arc073c 空心橙
shaber题,但是降智。
发现整体最小值和最大值无论如何一定被两种中的一种选,因此对其分讨。
若整体最小值和最大值是同种颜色,则只需让另一个区间尽量小,可以用堆解决。
若是不同种颜色,发现数值较小的放整体最小值所在堆一定更优。
时间复杂度 \(O(n \log n)\)。
2023.11.24
vp CF1656 CodeTON1
感觉这场和1270不相上下,一堆构造。
ABC三个水题,不写了。
D 1900
大眼观察样例,发现2的幂次必然不可行。
接下来发现如果数字足够大,最大可以整除 \(n\) 的2的幂次再乘2一定可行。
考虑数字较小,发现用除完之后的数就可以。
时间复杂度 \(O(T \log n)\)。
E 2200
无根树先转为有根树。
考虑对于一个节点的所有子树,子树内部权值必然全部相等,不妨设其为1或-1。
则很显然可以发现每个节点的绝对值就是连出的边数量,符号就是深度的奇偶性。
dfs即可,时间复杂度 \(O(n)\)。
F 2600
赛时想出来了,但是没调出来,赛后过的。
对柿子进行化简,将 \(a_i\) 提出来,发现是一个关于 \(a_i\) 的一次函数。
考虑这个一次函数的增减,发现仅和 \(t\) 的大小有关,因此无论如何最小生成树一定是两棵菊花拼接。
显然可以排序后前缀和预处理,一个一个直接跑。
时间复杂度 \(O(n \log n)\)。
Luogu P1975 (BZOJ2141)
一眼直接线段树套splay直接跑就可以过。
insert的时候挂了以为是splay的锅结果发现是线段树开小了/ll/ll/ll/ll/ll
2023.11.28
Luogu P1975 (BZOJ2141)
一眼直接线段树套splay直接跑就可以过。
insert的时候挂了以为是splay的锅结果发现是线段树开小了/ll/ll/ll/ll/ll
2023.11.30
CF1700D 1900 duel Skywave2022 win
我也不知道为什么要和tb duel,但是我就是duel了,还十分降智的1900做40min。
首先发现答案满足单调性,考虑二分。
考虑在 \(O(n)\) 时间内算出所有答案,发现前缀取 \(\max\) 加上后缀填满时间即可。
时间复杂度 \(O(n \log n)\)。
CF847L 2400
daily problem,有点水。
考虑构造方案。首先感觉无根树有点烦,不妨钦定一个根。
考虑所有点,往根一定是一个联通块,考虑这个联通块的大小,显然可以从大到小跑。
考虑如何连边。设目前的点为 \(u\),可发现充要必然是可以找到一个且仅一个点,他所包含的非向根连的块中包含 \(u\),且里面的所有点和 \(u\) 已连接的点相同。
时间复杂度 \(O(n^2)\)。
CF873F 2400
SA板题。
发现询问子串个数,自然考虑 SA。
先考虑全部结尾可行的情况,显然跑出height数组后单调栈即可。
考虑部分结尾不可行。发现结尾比较烦,将串翻转变成开头,答案相同。
跑出height数组后删除不可行的后缀串,height取 \(\min\) 即可。
时间复杂度 \(O(n \log n)\),瓶颈在 SA。
CF1657E 2200 duel Skywave2022 win
傻逼题,脑抽写假一次。
考虑 Kruskal 的过程,往根连的边越大则优先考虑,发现保证往其他未考虑点连边权比根边打即可。
考虑 dp。设 \(dp_{i,j,k}\) 表示目前已经设定了 \(i\) 个点,目前的最长边长度是 \(j\),连了 \(k\) 条,显然可以预处理后转移。
时间复杂度 \(O(n^2k)\)。
2023.12.1
CF514E 2200 duel Skywave2022 win
又一次打错模数,活不下去了/ll/ll/ll/ll/ll
矩快板子。
发现 \(d_i\) 范围很小,直接递推。
考虑深度较大的情况,显然可以矩阵转移。
时间复杂度 \(O(100^3\log k)\)。
CF1088E 2400
被诈骗了/fn
先不管 \(k\) 的大小,发现 \(k=1\) 一定有最大解。
先计算出解,很容易算出个数。
时间复杂度 \(O(n)\)。
2023.12.4
CF1788E 2200 duel _________________ lose
输的主要原因:不会写树状数组了/fn/fn/fn/fn/fn/fn/fn/fn/fn/fn/fn/fn/fn/fn
考虑裸的 dp,发现可转移的充要即为前缀和的大小关系,裸的 dp 复杂度 \(O(n^2)\)。
考虑优化。将前缀和排序,显然可以用树状数组优化,时间复杂度 \(O(n \log n)\)。
2023.12.6
CF1000E 2100 duel Skywave2022 win
傻逼题。
看到连通性自然想到 tarjan。
边双缩点后直接跑 dp 即可。