Loading

【题解】AGC019F Yes or No

先假装 \(n\geq m\) 。将最后的问题序列对应到网格图上,本质不同的问题序列的总数就是:从 \((0,0)\) 只能往上走一格或往右走一格,走到 \((n,m)\) 的方案数。

注意到最优策略显然是:当点在 \(y=x\) 下面的时候,猜 Yes,否则猜 No。最后一定是先猜一车的 Yes,假设第一次接触 \(y=x\) 线是在 \((i,i)\),在这之前所有答案为 Yes 的都能答对,所有答案为 No 的都答不对。

假设此时答案为 Yes,按照上述决策机制我们会回答 Yes,答对了。不过接下来变成了一个 \((i-1,i)\) 的子问题,需要改变策略为优先回答 No 。再假设继续往下走,第一次碰到 \(y=x\) 是在 \((k,k)\),那么中间经过了 \(i-k\) 个 No 和 \(i-k-1\) 个 Yes,按照策略这 \(i-k\) 个 No 我们都会答对,那么在 \((i,i)\) 去往 \((k,k)\) 的过程中,我们答对了 \(i-k+1\) 个问题。

假设此时答案为 No,按照上述决策机制我们回答了 Yes,答错了。不过接下来变成了一个 \((i,i-1)\) 的子问题,我们不需要改变回答策略。再假设继续往下走,第一次碰到 \(y=x\) 是在 \((k,k)\),那么中间经过了 \(i-k\) 个 No 和 \(i-k-1\) 个 Yes,按照策略这 \(i-k-1\) 个 Yes 我们都会答对,那么在 \((i,i)\) 去往 \((k,k)\) 的过程中,我们答对了 \(i-k\) 个问题。

这给了我们很多启发:如果自始至终没有碰到 \(y=x\)(除了 \((0,0)\)),那么我们应该能答对 \(\max(n,m)\) 个问题。但是如果在某个时刻碰到了 \(y=x\),并且下一步我们答对了,我们最终就会多回答对一题。

因此,我们只需要统计,有多少个 \((i,i)\) 满足下一步的答案为我们回答的那个(事实上,下一步的答案是 Yes / No 的概率是相等的),就会额外造成 \(1\) 的贡献。换句话说,只需要对每个 \((i,i)\) 计算有多少经过他的线,然后除二即可。

显然经过 \((i,i)\) 的线的个数为 \({2i\choose i}{n+m-2i\choose m-i}\),求和即可。

代码:Submission #26074767 - AtCoder Grand Contest 019

posted @ 2021-09-24 14:48  Qiuly  阅读(80)  评论(0编辑  收藏  举报