MX 炼石 2025 NOIP #3
qwq
2025 --【炼石计划 NOIP】-- 第三套
时间:4.5h (2025.09.04 07:40~12:10)
题目数:4
难度:
| A | B | C | D |
|---|---|---|---|
| \(\color{#FFC116} 黄\) | \(\color{#52C41A} 绿\) | \(\color{#3498DB} 蓝\) | \(\color{#BFBFBF} ?\) |
| *1400 | *1700 | *2200 | *? |
估分:100 + 60 + 20 + 0 = 180
得分:80 + 50 + 20 + 0 = 150
Rank:85/192
场祭
读题。
开 A 但是好像不会,感觉 B 似乎可做,瓶颈路立马想到重构树,但是推半天没推出来。
回去看 A,发现是可以 dp 的,先把所有任务按开始时间从小到大排个序,dp 分别对于每个节点,记录上一个任务的结束时间和完成的任务数,转移的时候二分找该从哪个结束时间转移即可,同时完成的任务数需要前缀 max 一下。
过大样例了,1h+。
开 C,按照求 LIS 的那个 dp 想了半天没想出来,甚至 \(O(n^2)\) 都没有,最后打了个暴力就扔掉了。
B,想到从小到大加边,但是发现不会动态维护双连通,最后只打了几个暴力和特殊性质。
D 没看。
补题
?怎么 B 这么简单。kruskal 求 MST 过程中,遇到加不进去的边 \((u_i,v_i,w_i)\),那么这条边一定构成了一个 \(u \leadsto {\rm lca}(u,v) \leadsto v \to u\) 这样的环,并且最大边权就是 \(w_i\),于是将 MST 上 \(u_i \leadsto v_i\) 的所有点的答案与 \(w_i\) 取 min 即可,可以树剖套线段树解决。
调了 2h 的死因:树剖 dfs 求重链的时候,把 dfs2(son[u],utop) 写成了 dfs2(son[u],u)。糖丸了。
当然根据题解,也可以更新完边之后把这条路径缩为一个点,这样可以少一只 log。
A 死因是没有考虑有可能在两个状态之间插入状态的情况。换句话说,所有 dp 到的状态都应该记录,二分可以利用 set/map 来做。
但是这样好像就不好维护前缀 max 了。不过注意到插入状态的位置不会太靠前,于是可以暴力求一遍后缀 max,但是这样 T 了一个点。又注意到状态的答案不会递增得很慢,而且插入的状态的答案也不会很大(毕竟是时间靠前的一个状态的答案 \(+1\)),所以从插入位置开始,只更新 \(100\) 个点,就过了。
不过看题解,不需要这么麻烦,只需要对每个 \(0 \to i\) 求出来最近的 \(i \to 0\),得到一些时间区间,取它们的最大区间无交的并集即可,因为要求取的区间无交,所以不会出现同一个 \(i \to 0\) 选择多次的情况。
C,好像也是比较常规的(?注意到因为是排列,所以 LIS 和 LDS 最多只有一个元素相交,所以答案一定是两者长度之和或两者长度之和 \(-1\),所以只需要判定是否存在无交的 LIS 和 LDS 即可。
赛时想到这里了,但是不会求。
先考虑一步转化,用总方案数减去有交的方案数,求出来无交的方案数看看是否 \(=0\),这样会好做一些。
这时候求 LIS 的那个 dp 是没毛线用的。换个 dp,令 \(f_i\) 为以 \(i\) 结尾的 LIS 长度,那么只需要用一个 BIT 维护前缀 max,\(f_i\) 就是 \(f_{1 \sim i-1}\) 中的最大值 \(+1\) 了,注意此处的 \(i\) 代表的是结尾的数而不是位置。
考虑枚举交点,假设 LIS 和 LDS 在位置 \(i\) 相交,那么就可以分别把 LIS 和 LDS 拆成 \(1 \sim i\)、\(i \sim n\) 两部分,这样就只需要统计以 \(i\) 结尾 / 开头的 LIS / LDS 的个数再乘法原理就可以了。而且容易发现求的这 \(2 \times 2 = 4\) 个东西其实是同一个东西,因为可以相互转化,所以只需要研究以 \(i\) 结尾的 LIS 的求法。
令 \(l_i , c_i\) 分别为以 \(i\) 结尾的 LIS 长度和个数。参照上面的 dp 容易递推出 \(l_i\) 来,考虑如何求 \(c_i\)。显然需要在维护 BIT 的同时,对于 BIT 上每个节点维护它的 \(c_i\),那么对于二元组 \((l_i,c_i)\),重新定义 \(\max\) 操作:
BIT 维护这个东西就好了。
注意统计方案数的时候,只需要减去长度符合 LIS / LDS 的交点 \(i\) 的方案数,毕竟如果无法满足 LIS / LDS 的要求,那么也是不会计入总方案数的。
不过方案数可能很大,但是我们只需要看看最后是否为 \(0\),所以随便模一个数即可。
D 需要平衡树,不补了。
天依宝宝可爱!

浙公网安备 33010602011771号