2020.10.07【NOIP提高A组】模拟 总结

估分:\(100 + 100 + 0 + 0 = 200\)
考场:\(0 + 100 + 0 + 0 = 100\)
(\(45\))

\(T1\)

考场打了个\(hash\)。不知道为什么炸了。
而后发现,原来不需要模。\(K<=10\),而最多只有四个字母。
所以最大也就\(5^10\)次方左右吧,只有\(100+\)万,用个桶来维护最后扫一遍即可。

\(T2\)

显然可以发现,只有当两个数同号的时候最后才会越走越远。
而且越远的话增速度会不断增。
于是考虑不停地走,直到同号且其中一个的\(abs\)大于给定的\(a0\)\(a1\)才停止。
在这些数里面去\(max\)\(min\),以及判断一下后面是否还有\(S[]\)再做做即可。

\(T3\)

考场打了个线段树来做,结果一直没有调对。\(WA0\)
正解是用一个单调队列来维护扔出去的数的递增。
再用一个队列来维护真实的扔出去的数。
而后有一个值记录当前前\([1,k]\)都曾有过的\(k\)
答案便是\(k\)与单调队列中的队头去\(min\)
要注意细节

\(T4\)

考场没有怎么想,被\(T3\)搞死了。
正解是设了两个\(DP\)转移(\(floyd\)
我们设\(f[u][c]\)表示从\(u\)点开始花最多\(c\)元钱可以走的最长路程。
显然可以用\(f[u][c]=max(f[v][c-p[u]]+dist[u][v][min(c,c[i])])\)
而对于那个\(dist\),如果我们直接看\(c\)来转移肯定炸。
但我们发现,对于一个点\(i\),我们需要求的只是用\(min(c[i],C)\)的油量能走到的最远路程。
而这个东西我们可以用倍增的思想来处理。对于\(k=min(c[i],C)\),我们将\(k\)用二进制来表示,对于\(1\)我们就可以用\(g[i][j][l]\)来转移。
\(g[i][j][l]\)表示\(i\)\(j\)\(2^l\)条路能走的最远路程。而这样我们就可以快速求出\(f[u][c]\)了。时间\(O(n^3*logn)\)
然后询问的时候就二分处理一下即可。

总结

有些简单的题也不要掉以轻心。
\(hash\)打得不多,导致错误率较高。
还有有些题明明可以用更简单的方法,一定要多想想。
比如直接用桶来代替\(hash\)
代码的调试能力有待加强。
有的时候题目太长了,但一定要看清楚,不要遗漏了条件

posted @ 2020-10-07 12:22  jz929  阅读(126)  评论(0编辑  收藏  举报