2023做题记录

本文同时发表于个人洛谷博客

部分收录于构造题部分

2023.11.3

Luogu P2467

上一次CF就是被这个trick坑了!/ng

\(dp_{i,j,k}\) 表示第 \(i\) 个在前 \(i\) 个中的位置为 \(j\) 时的方案数,\(k=0\)表示是山谷,\(k=1\) 表示是山峰,显然可以写出转移方程:

\[dp_{i,j,0}=\sum_{k=1}^{j-1} dp_{i-1,k,1} \]

\[dp_{i,j,1}=\sum_{k=j}^{i} dp_{i-1,j,0} \]

前缀和加滚动数组即可。

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

不会斯特林数。

发现两两攻击的次数其实就是给出了所有车可以放的行数,因此转化之后变成

\[A_{n}^{k} \times 2 \times \begin{Bmatrix} n\\k\end{Bmatrix} \]

其实我是推了半天\(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_mappriority_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 空心橙

Editorial

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\) 的一次函数。

\[w_{i,j}=a_i\times(t+a_j) +t \times a_j \]

考虑这个一次函数的增减,发现仅和 \(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 即可。

posted @ 2023-11-06 15:11  monster_hunterqwq  阅读(18)  评论(0编辑  收藏  举报