# HNOI2013 题解

HNOI2013 题解

[HNOI2013]游走

Tag:概率、高斯消元
设每个点被经过的期望次数为\(p_i\),度数为\(d_i\)
那么一条边的期望次数即为:\(\frac{p_u}{d_u} + \frac{p_v}{d_v}\)
问题变为求\(p_i\),显然\(p_u = \sum_{v}\frac{p_v}{d_v}\),高斯消元即可,注意\(1\)号点和\(n\)号点特殊处理。

[HNOI2013]切糕

Tag:建图、网络流
唯一的问题是如何解决距离不超过\(d\)
设从列\(A\)走到列\(B\),对\(A\)列和\(B\)列建一个回路,强制割\(B\)列的一段中的一个即可。

[HNOI2013]数列

Tag:组合数学
注意到\(M(K-1)<N\),所以枚举差分数组\(s\)
设枚举了一个差分数组\(s_1,s_2,...s_{K-1}\) ,和为\(S\),则方案数为\(N-S\)
所以\(Ans = \sum_{s_1,s_2....,s_{K-1}} (N-\sum_{i=1}^{K-1} s_i)\)
\(Ans = M^{K-1}N - \sum_{s_1,s_2...,s_{K-1}\sum_{i=1}^{K-1}s_i}\)
对于每一个\(s_i\),单独提出来:
\(Ans = M^{K-1}N - (K-1)(\sum_{s_i=1}^{M}1) M^{K-2}\)
所以\(Ans = M^{K-1}N - (K-1)M^{K-2}\frac{M(M+1)}{2}\)

[HNOI2013]消毒

Tag:暴力、二分图匹配
注意到\(a*b*c\leq 5000\),所以\(min(a,b,c)\leq 17\)
所以暴力枚举一面的情况,然后暴力二分图匹配即可。

[HNOI2013]比赛

Tag:搜索、哈希
按照顺序暴力搜索,考虑减少搜索数。
设我们搜完了\(s\)个人,还剩下\(t\)个人。
将他们此时的分数排序,所有结果相同的状态方案数都一样。
所以就把这个东西哈希起来后记忆化即可。

[HNOI2013]旅行

Tag:思维、构造、单调队列
题目大意:给定一个只由\(1\)\(-1\)构成的序列,
现在要求将其分为恰好\(m\)段,使得所有段的和的绝对值的最大值\(ans\)最小。
设序列长度为\(n\),后缀和为\(sum\),后缀和为\(0\)的位置有\(cnt\)个,序列和为\(S\)
先扔结论:\(ans = \lceil \frac{|S|}{m} \rceil\)
注意到\(S=0\)时事情好像有点不太对劲...所以单独讨论一下\(S=0\)的情况。
\(S=0\)时:

  • \(cnt[1]\ge m\) ,则\(ans=0\),直接选最后一个和\(m-1\)个后缀和为\(0\)的即可。
    我们顺次确定答案,设当前确定第\(i\)个休息点。
    只要后面的后缀\(0\)个数大于等于\(m-i\)就把元素入队,维护单调队列即可。

  • \(cnt[1]<m\),则\(ans=1\)
    假设\(ans=0\),那么选的倒数第二个的后缀和得要是\(0\),同理倒数第三个也是\(0\)...
    然而我们后缀和为\(0\)的位置不足\(m\),故答案不可能是\(0\)
    然而我们是一定有办法让答案变成\(1\)的,我们把后缀和的变化曲线画出来。
    那么合法的一段就是一个类似等高线的东西,我们调整等高线一定能使答案变为\(1\)
    至于构造方案与\(S\neq 0\) 的情况放在一起。

\(S\neq 0\)时,\(ans = \lceil \frac{|S|}{m} \rceil\)
考虑把\(-1\)与最近的\(1\)缩到一起,那么最后序列就是由\(S\)\(1\)\(-1\)构成的。
所以答案自然就是\(\lceil \frac{|S|}{m} \rceil\)
我们假设已经确定了上一个休息点为\(last\),当前确定第\(i\)个休息点。
那么新的休息点\(a\)需要满足条件:

  • \(n - a\ge m - i\)
  • \(\lceil \frac{|sum[a+1]|}{m-i} \rceil \leq ans\)
  • \(|sum[last+1] - sum[a+1]| \leq ans\)

这个好像没法做了.....没法做就暴力呗!
对每一种\(sum\)单独开一个单调队列,
每次暴力\(for\)一下\(sum\in[sum[last+1]-ans,sum[last+1]+ans]\) 的元素。
如果满足\(n-a\ge m-i\)就加入答案队列。
对于答案队列,当队头出现\(pos\leq last\)时弹掉队头即可。
复杂度:\(O(m\lceil \frac{|S|}{m} \rceil) = O(|S|)\),可以说这题是相当神仙了。

猜你喜欢

转载自www.cnblogs.com/GuessYCB/p/9829612.html