hihoCoder挑战赛23
A.Emulator
题意
- 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路。
- 求最多可以去掉多少条边,使得任意两点的最短路长度不变。
思路
- 若一条边\((i,j)\)可以去掉,那么必然存在路径\(d(i, k) + d(k, j) = d(i, j)\)。
代码
B.Certificate
题意
- 已知有\(N(N \le 14)\)个变量,变量取值\(0\)或\(1\)。
- 已知\(f(0,0,\cdots,0),\cdots,f(1, 1,\cdots,1)\)的函数值。
- 对于每种输入\(x=(x_0,x_1,\cdots,x_n)\),求最少需要知道几个变量的值即可确定函数值。
- 举个例子:假设有两个变量,函数\(f(a,b)=a \verb'&' b\),那么对于\(f(x)=0\),我们只要知道其中一个变量为0即可确定函数值为0,否则我们需要知道两个变量是否都为1,才能确定函数值为1。
思路
- \(2^n\)枚举每个取或不取,在要取的变量所有取值中判断是否只会取到唯一值,即不同时取到0和1,这样说明对应的取值是可以判定函数值的,时间复杂度\(O(4^n)\),约为\(2 \times 10^8\),结合单点3000ms应该是可以过的。
- 显然官方题解肯定不是这么做的。
- 对于每个变量,显然只有3种状态,取0、取1或不取。这样做的复杂度为\(O(n \times 3^n)\)。
代码
C.Little Y's Tree
题意
- 给一棵树,有\(N(N \le 10^5)\)个点。
- 有\(Q(Q \le 10^5)\)次操作,每次删掉\(k\)条边,求\(k+1\)个连通块的最远点对的距离和,保证\(\sum{k} \le 10^5\)。
思路
- 一个前提:是要会线段树维护子树的最远点对。
- 删除一条边,相当于把子树的dfs序挖掉了一些区间,在剩余区间中求最远点对即可。
代码