tg 67

T1

按下列情况先后讨论即可
\((3,3,4),(3,3,2,2),(4,4,2),(4,2,2,2),(2,2,2,2,2)\)
这样可以尽可能把木棍全部用完,符合贪心策略

如果后面\(4,2\)两种木棍共存但是处于\(N_2=N_4\cdot[0.5,3]\)的时候,
解方程注意精度

如果\(N_2\)最后一个不剩,不需要讨论只用\(2\)的情况

注意代码顺序!

T2

首先可以把 \(ai\)从小到大排序,发现这样并不会改变答案而且简化了问题。
没有什么其他的性质了,直接考虑 \(dp\)吧。
考虑每次增量一个左部的点,然后考虑它连出去的两条边,达到的效果就是合并两条路径。
所以我们可以记录路径个数,为了简化计算我们定义路径为有向路径。
\(f_{i,j}\)表示考虑前 \(i\) 个左部点,形成的有向路径数量是 \(j\) 个。
转移可以分两部,第一步是添加 \(a_i−a_{i−1}\)个右部单点:

\(dp[i][j]←\sum\limits_{k=0}a_i−a_{i−1}\cdot dp[i−1][j−k]⋅(a_i−a_{i−1}k)\)

第二步是任取两条有向路径合并:

\(dp[i][j]←dp[i][j+1]⋅j⋅(j+1)\)

时间复杂度 \(O(n2)\),我们在第一步转移之后将 \(dp[i][1]\) 计入答案。

T3

题意等价于"最大值最小"
发现答案有单调性
直接二分答案

考虑转换成是否可以安排\(K\)个点使得\(mid\)时间合法
发现还是做不了,考虑进一步转换
存在性找最小值,就是最少安排多少点使得\(mid\)时间合法
最后看\(ans\)是否大于\(0\)

直接树形\(DP\)维护这个过程。
对于一棵子树,有可能被完全覆盖了,
也有可能遇到一个叶子深度小于\(k\),这个时候暂时不去覆盖它。
完全覆盖的情况我们记录树根往外延伸的距离。
有叶子没覆盖的情况就记录这个叶子的深度,
这种情况不用记录上个情况的距离,
我们最后是用子树外的点去覆盖它,
这个点从树根延伸出去的距离肯定大于当前的距离。
直接合并子树信息即可。

posted @ 2022-10-18 18:04  2K22  阅读(55)  评论(0)    收藏  举报