ASC10

发布时间 2023-06-02 17:02:55作者: jucason_xu

先写 A,看上去有点像上一场信号塔那个题。

A - The Smart Bomb

考虑三个之间的距离是 \(x,y,z\),三个的半径分别是 \(a,b,c\),那么当三个之间的距离之和最多是 \(x+y+z\)。考虑如何取到。即 \(a+b=x,a+c=y,b+c=z\),解方程即可。

G 的标题吓一跳,看一眼时间 2005,看来不是玩梗

G - Cracking SSH

可以 dp,设 \(dp_{i,j}\) 表示当前填到第 \(i\) 位,前一位填的是 \(j\) 的最优答案。转移枚举上一位是什么,复杂度 \(O(n|\Sigma|^2)\),回溯输出方案。

G 之后是 D,看到标题想到了 655D 还没补。

D - More Divisors

考虑搜索,我们知道假如一个数的质因数分解方案是 \(\prod p_i^{a_i}\),那么它的质因子个数是 \(\prod (a_i+1)\)。然后因为要最小答案,我们很明显钦定它的质因子就是前 \(i\) 个质数是最优的。然后拿着当前的数和因子个数枚举下一个质因子选多少个进行搜索。实测 30ms

E 花了我一段时间。

E - Long Dominoes

考虑轮廓线 dp,\(dp_{i,j,msk}\) 表示当前处理到第 \(i\) 行和第 \(j\) 列,除了一定要填的位置以外,每个位置又从轮廓线突出了 \(\{0,1,2\}\) 的长度的方案。然后每次如果当前位置是 \(0\) 就需要放,不是就将当前位减一贡献。否则枚举当前横着放还是竖着放。横着放就是当前变成 \(2\),竖着放只能在当前往下连续三位都是 \(0\) 才可以。填过之后依旧都是 \(0\),但是要更新到 \(dp_{i,j+3,msk}\),因为一次填了三位。
最后只用 \(0\) 更新答案。时间复杂度 \(O(nm^23^m)\),不过挺快的。而且答案范围在 long long 里,不用 __int128 或者高精。

E 完成之后看 F,一开始感觉是计算几何,准备弃了,结果发现好像不是很复杂。

F - The Magic Wheel

考虑上面和下面分开处理,因为完全是一样的。然后一点很恶心的是 \([-2\pi,2\pi]\),需要自己手动搞到 \([0,2\pi)\) 然后排序,三个都要来,很闹心。
然后考虑如何划分,发现交叉一定没有不交叉更优,所以只要上面和下面按照原顺序匹配,然后旋转一下就可以了。两点距离可以用勾股定理+弧长算,注意有两种走法,取较小的一个。比较良心的是点不重合,不然 sort 什么的还要自己写 eps 下的比较。

之后就是 K,第一眼什么东西,然后读题发现,这奇怪的一堆数还真就只有一开始公式那里套用一下。

K - Unfair Contest

先按照公式计算出 \(e_{i,j}\)\(t_{i,j}\),然后那一堆大写字母输入就可以扔掉了。然后枚举使用哪些题,虽然枚举是 \(O(2^m)\) 的,但是我们只要恰好选 \(n\) 个的,实际有用的只有 \(\binom{m}{n}\)。然后对每个人计算他们的题数和罚时,也就是直接把他们的开题顺序 sort 跑出来,然后模拟即可得到第一个人的排名,选择最优的一种记下来。复杂度 \(O(\binom{m}{n}nm\log m)\),也跑的很快。

I - Trade

网络流。考虑用网络流流出最多删掉的边数。首先每个点至多删掉 \(deg_i-2\) 条边,如果不够 \(2\) 就直接无解。然后在左部点和源点连边,流量是 \(deg_i-2\),右部点和汇点连边,流量也是 \(deg_i-2\),然后左右之间就是原来的二分图。跑完最大流检查每条边的流量观察是否被删掉,然后输出方案即可。

C - Order-Preserving Codes

题意没看懂,看成了哈夫曼树板子,直接挂了,然后才发现是保证字典序的哈夫曼树。那么我们考虑从上开始分治,\(dp_{l,r}\) 表示对区间 \([l,r]\) 建立树的最小代价,那么 \(dp_{l,r}=\min dp_{l,d}+dp_{d+1,r}+sum_{l,r}\)
很明显是 \(O(n^3)\) 的 dp,不太好做。考虑转移点的性质,似乎把整个区间按照权值平均分会比较优。但是这样还是会挂,因为在越有序的序列上,下标对答案的影响就会越大,就会导致最优转移点偏移。同时转移点也没有单调或者凸之类的性质。
但是我们发现最优转移点的偏移不会非常大,不太会超过 \(2\sqrt{n}\) 这个级别(在 \(n=2000\) 的有序序列时候大概是 \(73\))。这就很好了,因为区间按照权值平均分的话,分成两边的差的绝对值是单峰的,也就是斜率的正负性是单调的,可以对斜率二分出来。然后假设跑出来的点是 \(s\),就对 \(s-2\sqrt{n}\)\(s+2\sqrt{n}\) 里的 \(d\) 暴力转移,然后每次找到当前最优转移点划分,左边 \(0\),右边 \(1\),输出答案。