Dashboard - 2025 Hunan Multi-School Training Round 2 - Codeforces
D 排序后从中间向两边取。
I,J,B,H参考博客:https://www.cnblogs.com/lyrrr/p/18780739
Problem - K - Codeforces
给定长度为 \(n\) 的序列 \(a\),\(a_i\) 表示有 \(i\) 个中子的原子可以释放 \(a_i\) 的能量,一个中子数大于 \(n\) 的原子可以分裂成两个原子(中子数不为 \(0\)),问中子数为 \(k\) 的原子释放全部能量后,释放的能量的最小值。
容易猜到当 \(k\) 很大时,会一直分裂出 能量/中子数 最小的原子,直到小于某个值 \(m\)。
可以证明,\(m=n^2\) 时一定正确。
设 \(dp_i\) 表示中子数为 \(i\) 时的最小能量,预处理到 \(m\) 即可。
关于转移:
for(int j = n + 1; j <= m; ++j)
for(int i = 1; i <= n; ++i)
dp[j] = min(dp[j], dp[j - i] + a[i]);
for(int i = 1; i <= n; ++i)for(int j = n + 1; j <= m; ++j)dp[j] = min(dp[j], dp[j - i] + a[i]);
上面是对的,下面是错的,问题在于前 \(n\) 个状态是固定的,考虑 \(n=5\) 时,\(a_1=10000,a_2=1,a_3=1,a_4=10000,a_5=10000\),此时 \(dp_8\) 的结果应该为 \(3\)。(\(a_2+a_3+a_3\))
只能在 \(a_3\) 转移后,从 \(dp_6\) 转移到 \(dp_8\),但是不会在做 \(a_2\) 的转移。
若没有前 \(n\) 个状态固定的限制,则两者都对。
(太难察觉了,认了)
Problem - F - Codeforces
给定一棵树,一些节点被染色成红色,一个节点的代价为它与距离它最近的红色祖先节点的距离。
多次询问,每次给定一个集合,至多可以在再将树上的一个节点染成红色,求集合中的点的代价的最小值。
二分答案,此时集合中的一些点不满足条件,将这些点的 \(LCA\) 染成红色,再判断是否符合答案。
复杂度为 \(O((\sum{k})\log k\log \sum w)\)。
可以不使用二分,因为每个点的代价是固定的,将这些点按照代价从大到小排序后,不满足条件的点一定是一个前缀。
Problem - E - Codeforces
给定只含有I
C
P
的字符串,一个“好”的字符串定义为其中两种字符个数相等,另一个字符的个数比任何一个字符个数多,求将一个字符划分成若干个“好”的字符串的方案数。
设 \(I_i,C_i,P_i\) 为前 \(i\) 个字符中对应字符的个数。
设 \(dp_i\) 表示前 \(i\) 个字符构成字符串的答案,若能从 \(dp_j\) 转移,需要满足以下条件之一:
\(I_i-I_j=C_i-C_j,P_i-P_j>I_i-I_j\);
\(I_i-I_j=P_i-P_j,C_i-C_j>I_i-I_j\);
\(C_i-C_j=P_i-P_j,I_i-I_j>C_i-C_j\);
移项后得到:
\(I_i-C_i=I_j-C_j,P_i-I_i>P_j-I_j\);
\(I_i-P_i=I_j-P_j,C_i-I_i>C_j-I_j\);
\(C_i-P_i=C_j-P_j,I_i-C_i>I_j-C_j\);
将第二维离散化后可以用树状数组加速,空间复杂度很优,为 \(O(n)\)。
这里使用动态开点线段树实现,时间复杂度和空间复杂度都为 \(O(n\log n)\)。
平衡树的空间复杂度也是 \(O(n)\),感觉快取代线段树了。
Problem - A - Codeforces
2022-2023 ICPC, Asia Yokohama Regional Contest 2022(题解)-CSDN博客