2025 云斗
10/19 Contest 2
A:发现最小的操作就是填满一整行然后一列一列覆盖全图;注意判第 i 行时如果整张图的第 i 列全空就要多一次操作
B:线段树。题目相当于在环上找长度为 \(3\) 的上升子序列数。先简单统计不跨越边界(也就当成序列直接做)的答案数。再统计 2,3,1 和 3,1,2 的情况。第一种情况我们正序枚举 1 的位置,这样就是找前面 \(a<b,a>x\) 的数量(x 是当前 1 的值),用值域线段树维护。
线段树上位置 \(i\) 的值就是 \(j>i,a_j>a_i\) 的数量,用两个键值 \(s=0/1,f\) 维护,s 就代表 \(i\) 是否已经出现过,f 就代表 \(i\) 后面 \(a_j>a_i\) 的数量,如果当 \(s=0\) 时加的 \(f\) 不会造成贡献,就成功维护了 \(j>i\) 的条件。
10/26 Contest 5
A:小分讨+dp
C:发现是所有的数和它的倍数有限制,对于值域 \(n\) 这样的限制也只有 \(\sum\limits_{i=1}^n\frac{n}{i}=n\log n\) 个,考虑如何表示这些限制。
考虑对于限制 u,v,若两点都不是对方的祖先,那么就不能有 u 子树中的点和 v 子树中的点相连;若 u 是 v 的祖先,那么设 w 为 u 的一个儿子,同时也是 v 的祖先,那么所有不在 w 子树中的点不能和在 v 子树中的点相连。我们发现这些性质在 dfn 序上都是一段连续的区间,想到在 dfn 上扫描线;例如不是祖先就是两个区间内中的点不能互联,是祖先就是一个前缀和一个后缀不能和一个区间相连;扫描线直接做即可。
D:发现题目的操作相当于对于每个小段内部的值全部反转,最后整个序列每个值翻转一次(然后由于整个序列连续翻转两次后就没变所以可以暂时不管到结束再管)。
考虑像快排一样选定一个值然后对于它 0/1 分组,也就是大于的就是 1,小于的是 0,然后就从 010101..->000...1111,然后递归即可。
关于 01..01->00...11 的实现我们可以想,连续的相同值缩一起,这样就一定是 0101010101 的序列,对于每个 |0|10|1| 这样分段就能成 01,这样一个长为 \(len\) 的 01..01 序列一轮操作就能长度减半,转换就只用 \(O(\log_2 len)\) 次操作,总操作就是 \(O(\log_2^2 n)\),已经可以通过。
学长解释可以 |0|10|1|01| 这样消掉 3 个,就是 \(O(\log_3^2 n)\) 的。
10/28 Contest 7
A:每人的舒适度直接对 T 取模然后枚举哪一对相邻的人距离房间温度最远即可。
B:直接枚举每个点作为直径中点时求往外走 \(k/2\) 步到达的点的个数即可。
注意如果 k 是偶数就枚举点作为中点,否则枚举边。
C:设 \(f_i\) 表示以 \(i\) 为起点,长度最小的子序列使得该子序列无法被 \([i+1,n]\) 构造出来。
对于节点 \(i\) 设后面第一个与其相同的节点的位置为 \(p_i\),则我们需要从 \(f_j,j\in[i+1,p_i]\) 转移过来。直接暴力转移即可 \(O(n\sum)\) 求得,\(\sum\) 为字符集大小。
10/30 Contest 1
A:正确做法应为 dp,\(f_{i,j,x,y,0/1/2}\) 表示枚举到点 \((i,j)\),字符串 x 的第 y 个字符,上一次从上还是从左还是从右转移过来(因为不能重复走。赛时没看到不能重复走写了个 dij 数据太水过了。
B:用栈维护左括号和值,枚举到右括号时就把它和最近的左括号中间的值合并,一个括号内符号一定一样。对于加法直接求和并和 \(q_k\) 取 min。乘法就考虑尽量让所有值都是 \(\frac{q_k}{k}\) 这样最终答案一定最大,但如果有些值的上限小于它就取它上界并 \(q_k\gets q_k-val\),然后继续接着做就好,需要先把一组内的值按照上界排序再这样做。
C:发现最终答案就是 \(\sum L-\sum X\),X 就是每道菜做好的时间,所以直接按照做每顿饭的耗时每次从小到大排序求就好了。
这个可以用值域树状数组维护。

浙公网安备 33010602011771号