2019 Moscow Workshop 题解

day1

  水题

【H,J,K,L,M】

  待补。

【B√】

  题意:有一个 \(w \times h\) 的桌面,上面有 \(N(\leq 11)\) 个球,每个球有一个半径 \(r\)。现在 \(1\) 号球以 \((vx,vy)\) 的方向前进,遇到桌的边界会完全弹性碰撞。问 \(10000\) 个单位长度内,它先撞到别的哪个球。
  题解:看上去要圆与圆求交。一个经典的处理方式是:可以将关键的圆看成点,别的图形相应地做变化即可。在这里,桌面边界会往里缩,其他圆的半径会增加 \(r\)。处理 \(1\) 号球的碰撞时,只需处理点的反射。

【C√】

  题意:对于 \(1 \leq A \leq B \leq 10^{18}\),记 \(k_i\)\(A \sim B\) 数字中二进制第 \(i\) 位是 \(1\) 的数字个数。现在给出 \(k_i (i \leq 63)\),判断 \((A,B)\) 的有解性,如有唯一解同时给出解。
  题解:从大到小考虑 \(k_i\)。每次考察 \([A,B]\) 是否跨越了 \(2^i\) 这条分割线。如果没有跨越,那么我们知道 \([A,B]\) 是在 \([2^i,...]\) 区间里一个长度为 \(k_i\) 的区间,继续递归下去求解。如果跨越了,根据 \(k_i\),我们可以直接定位出 \(B\) 的值(\(A\) 也可以通过二分来确定);注意上层递归下来时,可能有 AB 长度要求,必须同时符合才行。

【E√】

  题意:给出一个最多 \(1000\) 项的多项式 \(F(x)=\sum a_i x^{b_i}\),其中 \(a_i \leq 10^{15},b_i \leq 10^9\)。已知 \(F(x)=F'(x)=0\),求符合要求的最小正整数解 \(x\) 或输出无解。
  题解:由题意可证,\(x^2 | a_k\),其中 \(k\) 是次数最小的非零项。快速分解 \(a_k\) 后,直接枚举所有符合要求的 \(x\) 即可。check 时,可以给出一些模域;多个模域下为 \(0\) 可视为答案为 \(0\)。快速分解时,可以只枚举到 \(10^5\),剩下的质因子只可能是 \(P,PQ,P^2\),而只有第三者才有意义。

【F√】

  题意:初始时有一个三个点的二叉树,“剪贴板”上也是这棵树。每次可以选择一个叶子,将其替换为剪贴板上的内容。每步操作完成后,可以选择将整棵树放入剪切板(不消耗步数)。给出一棵 \(N(\leq 1000)\) 个点的二叉树,问可以最少几步变成它。
  题解:考虑最后一次复制后的图形。如果枚举了它的大小 \(k\),我们可以知道它的具体形状,也可以通过树哈希在 \(O(N)\) 的时间里,判断它是否可能。还会发现一个性质时,对于这个图形之前的小图形,因为能拼成这个,一定也能拼成总体。所以首先,我们可以枚举所有 \(N-1\) 的约数 \(k-1\),check 一遍以 \(k\) 为模板是否可行。如果枚举了最后的图形,我们要知道从初始开始最少几步到它,这可以通过对所有合法的约数做一遍预处理DP后得到。复杂度为 \(O(K^2+NK)\)\(K\)\(N\) 的约数个数。

【G】

  连通性DP。

【I√】

  题意:有 \(R(\leq 128)\) 行格子,每行 \(C(\leq 16)\) 个。给出 \(R\) 个长度不超过 \(C\) 的字符串,将它们依次填在每一行,使得字符串字符的相对顺序保持不变(有些位置为留空)。定义一个有字符的格子的价值为:其上下左右和它一样的格子个数。求可能的最大的总价值。
  题解:很容易想到按行转移,每行最多会有 \(C_{16}^8\) 中状态。看上去状态数不多,但是显然不能支持平方的转移。比赛的时候想到了各种优化转移的方法,甚至要利用 trie,但是效果都不好。
  其实只要按格子一格一格转移(类似于轮廓线DP),这种表示方法也支持快速算代价,复杂度就是 \(RC2^C\)

day2

【A√,B】

  水题/模拟题

【G,J,K】

  待补

【C】

  题意:给出平面上 \(N(\leq 100)\) 个点,没有三点共线的情况。要求画 \(\lceil \frac{n}{2} \rceil\) 条直线(将平面划成一些区域),使得每个点仅属于一个区域。
  题解:(待验证)每次找到一条能将点集划成一样多的分界线,两侧各求一下个凸包,并求两个凸包的公切线。然后做一条将两条公切线分开的直线。

【D√】

  题意:求 \(N\) 个点的 每个连通块最多只有一个环的 带标号图的个数。
  题解:带标号无根树个数是 \(N^{N-2}\),考虑如何计算带标号基环树的个数。假设一共有 \(N\) 个点,环长是 \(M\)。对除环以外的 \(N-M\) 个点做 \(prufer\) 序列。该序列最后一个点必须是环上的点(因为做到的最后一个点的父亲必然在环上),其他随意。所以方案数是 \(M \times N^{N-M-1}\)。再乘上 \(\frac{(M-1)!}{2} \times C_{N}^M\) 即为 \(N\) 个点环长为 \(M\) 的带标号基环树个数了。最后做一遍背包即可得到答案。

【F√】

  题意:有三只怪兽,攻击为 \(A_i(\leq 10^9)\),血量为 \(B_i(B_1 \leq 10^{18},B_2,B_3 \leq 100)\)。每轮开始时,所有活着的怪兽对你造成等同于它们攻击力和的伤害。第 \(i\) 轮时,你可以选择一只怪兽,对其造成 \(i\) 点伤害。怪兽血量非正时死亡。问打完所有怪兽后最少受到多少的伤害。
  题解:假设每轮都在打第一只怪兽。我们可能会在某几轮,“抽空”去打另外两只。设 \(f_{i,j,k}\) 表示到了前 \(i\) 轮,二三两只怪兽分别受到了 \(j,k\) 点伤害时,我们受到的最小伤害。注意这种表示下,如果 \(k \geq B_2\)\(j \leq B_3\) 也是有意义的,因为我们要根据 \(i,j,k\) 算出,我们已经对第一只怪兽造成了多少伤害了;这样也可以快速算出转移时我们每轮受到的伤害和。
  当超过 \(102\) 轮后,另外两只怪兽要不已经死了,要不被留在最后再攻击。

【H√】

  题意:给出两棵 \(N(\leq 10^5)\) 个点的带边权的树。求 \(\sum_{i,j} Ad_{i,j} \times Bd_{i,j} \mod 10^9+7\)。其中 \(d_{i,j}\) 表示 \(i \sim j\) 的距离和。
  题解:考虑对第一棵树进行点分,每次计算经过分治中心 \(x\) 的所有 \(Ad_{i,j}\) 产生的贡献。将 \(Ad_{i,j}\) 拆成 \(Ad_{i,x}\)\(Ad_{j,x}\),每个可以分开独立算。固定一棵子树,以及子树里的一个点 \(u\),对于所有 \((u,v)\)\(v\) 在子树外),要计算 \(B\) 树中 \(d_{u,v}\) 的和。为了方便,可以先计算所有 \(pair\) 的距离和,再容斥地减掉 \((u,v)\) 都在子树内部的方案数。
  可以在 \(B\) 树上建出 \(A\) 的虚树,两遍 \(dp\) 求出距离和。也可以先构建一棵 \(B\) 的点分树,快速求一个点到一个点集的距离和。
  常数较大,可以考虑一些优化。比如,容斥过程中,没必要直接在当前层减掉子树的方案(因为这样要在虚树或者点分树里重新插入子树里的所有点)。到了下一层,本来就会有插满整棵树的过程,我们可以到下一层时再减掉。

猜你喜欢

转载自www.cnblogs.com/jiangshibiao/p/10527659.html
今日推荐