打了UOJ Round 17,这么低的分居然还涨rating?!
T1:
开始读错题了,1h以后写的暴力过不了样例开始慌,手玩样例发现读错题了,然而并没有时间改,写了子任务123就跑了。
T2:
计算几何的气息,直接跳过。
T3:
概率期望?看来没得做了。手玩了菊花图的10分,打个表发现其余的跑不出来,弃掉了。
捆绑测试,有分基本上也都卡没了。
题解:
T1:
最优答案肯定是一条链。
对于任务34,我们可以直接找最小的,最多log次就会减到最小,复杂度\(O(n*log_{2}{n})\)
对于任务5,我们可以枚举一下a[i],设计状态数组f[i]表示在状态i时,变成0最少需要多少代价。
f[i]=min(f[i],f[i&a[i]]+a[i]),复杂度\(O(n*max_w)\)
满分做法是我们不枚举a[i],而是枚举一个子集S,找a[]中是否有一个数和它与起来为0.
这样先预处理a[i]补集的子集就可以了,复杂度是\(O(3^{log_{2}max_w})\)
转移方程就变成了\(f[i]=min(f[i],f[i^s]+i^s)\)
注意可能所有的数与起来不为0,在总的或起来的数异或上它就可以了。
T2:
对于一定在端点的情况,我们设状态数组f[i][j],表示一个点为i,另一个点为j时是否能够到达(stx,sty);
然后二分答案,记忆化一下,复杂度\(O(n^2*log_{2}n)\)
满分做法:
仍然是二分答案。
设状态数组f[i][j]表示一个点在第i个节点,一个点在第j条边上是否合法。
i和j的最小距离必须小于等于二分的答案v。
由于把一条直线摆直时,另一条直线一定单调,所以取最小距离就可以了。
f[i][j]可以有f[k][j]转移过来,k为j的某个端点,j为与i相连的直线;或f[k][j],k与i相连。
仍然是bfs一下,复杂度\(O(n^2*log_{2}n)\)。
T3:
题解和代码都鸽了……