10月31日模拟赛题解
T1 腿部挂件
可持久化\(Trie\)树,略过
T2 走夜路
题意:手电筒的电量上限为\(T\),\(Jim\)从\(0\)号节点依次走到\(n + 1\)号节点,每个点到下一个点的距离为\(D_i\),冲单位电量的花费为\(P_i\),求旅途的最小花费,如果无法保证全程手电筒都亮着就输出\(-1\)
\(1<=n<=5e5\)
解法:
贪心。
用一个单调队列\(/\)单调栈来找到下一个节点,满足该节点是最近的花费\(\le\)当前节点的节点。如果该节点到当前点的距离大于T,说明在接下来T的距离内没有更便宜的了,那就直接充满,否则就充到刚好够到下一站。
T3 宝石专家
题意:有\(n\)个宝石,每个宝石有一个特征值\(a_i\),有\(m\)个询问,询问\([l,r]\)中间两个特征值相同的宝石的最近距离。
\(1<=n,m<=2\times10^5\)
解法:
线段树 + 排序
这道题是进行区间询问,所以显然要使用线段树,但最近距离需要满足两个宝石都位于所查询的区间内,所以我们离线处理每一个询问,然后按右区间进行排序,对于每一个宝石我们求出它左边边第一个相同特征值的宝石到它的距离,然后每次访问下一个询问,就把上一个询问的右区间到当前询问的右区间每一个点更新它左边相同特征值的第一个点,这样处理以后,我们查的每一个点所对应的距离,就可以直接用线段树进行查询,因为一个点在查询的区间内,则它所对应的点一定也在区间内,这样解决掉了线段树查询时要求两个点都在区间内的问题。
题外的知识点:
强制在线:当前询问需要用到上一个询问的答案,就需要强制在线做。