交互题、二分、次大值、最大值
交互题。给定一固定的数列,每次可询问一区间的次大值的位置,要求在 20 次询问内找到该数列的最大值的位置。$2\le n\le 10^5,1\le l<r\le n$。
先对整个序列区间进行询问找到整个序列的次大值的位置 $pos$,然后询问 $[1,pos]$,得到该区间的次大值位置 $pos1$,若 $pos1==pos$,则说明最大值位置在 $pos$ 左侧,否则在 $pos$ 右侧。假设最大值位置在 $pos$ 右侧,则需要找到最小的 $r$ 使得 $ask(pos,r)==pos$,此时的 $r$ 即为最大值位置。所以简单说来就是用两次询问找到最大值在次大值左边还是右边,然后二分找最大值位置,最多需进行 $2+\lceil\log_2^{1e5}\rceil=2+17=19$ 次询问。
二分答案、中位数、前缀
给定长度为 $n$ 的数列和 $k$,要找到长度至少为 $k$ 且具有最大中位数的子区间。$1\le k\le n\le 2\cdot10^5,1\le a_i\le n$。
先考虑这样一种情况:数列中全为 $-1$ 或 $1$。要使某区间的中位数为 $1$,只需该区间的和为正。对于本题,二分答案,假设为 $x$,则把大于等于 $x$ 的数变成 $1$,小于 $x$ 的数变成 $-1$,然后求出前缀和 $sum[i]$ 以及前缀和的前缀最小值 $minsum[i]$。对于每个位置 $i$,若 $sum[i]-minsum[i-k]>0$ 则存在中位数大于等于 $x$ 的区间。时间复杂度 $O(n\log n)$。
最短路,构造,虚点
给定一个无向图,不保证连通,每条边有花费 $w$,每次走必须一次性走两条边 $a\rightarrow b\rightarrow c$,花费为 $(w_{ab}+w_{bc})^2$,求从 $1$ 号点走到其他每个点的最小花费,若不能到达则输出 $-1$。
一看题目是跟最短路有关的,但是不能直接套用 dijkstra 模板。注意到边权 $w_i\leq 50$ 考虑添加虚点。对每个点 $v$,添加虚点 $v(w)=v*51+w$,其中 $w$ 是与之相连的边的权值。对于边 $(u,v,w)$,连边 $u\rightarrow v(w)$,权值取 $0$,再连边 $u(was)\rightarrow v$,权值取 $(was+w)^2$。这样一来,若 $u$ 是作为三个点 $q,u,v$ 的中间结点,则会走 $(q,u(was),0),(u(was),v,(was+w)^2)$ 这两条边。当 $v$ 作为中间结点时同理。按这种方式建图,然后从 $1$ 号点跑 dijkstra 即可得到答案。