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\)。
代码的调试能力有待加强。
有的时候题目太长了,但一定要看清楚,不要遗漏了条件