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