记忆中每次场上想出踩 std 的做法的时候都会因为各种原因没有场切,怎么回事呢???

考虑假如我们知道一对满足 px<pyp_x < p_y(x,y)(x, y),那么可以通过询问 (x,y),(x,z),(y,z)(x, y), (x, z), (y, z) 来得知 px,py,pzp_x, p_y, p_z 之间的大小关系,并且假设 px,py,pzp_x, p_y, p_z 的中位数为 oo,那么有 ao=Q(x,y)+Q(x,z)+Q(y,z)2max(Q(x,y),Q(x,z),Q(y,z))a_o = Q(x, y) + Q(x, z) + Q(y, z) - 2\max(Q(x, y), Q(x, z), Q(y, z))

那么我们可以考虑 ii 从小到大枚举的同时动态维护 p1,p2,,pip_1, p_2, \dots, p_i 的顺序。

假设 pid1<pid2<<pidip_{id_1} < p_{id_2} < \cdots < p_{id_i},其中 idid 为一个 1i1 \sim i 的排列,并且我们已经提前知道了每个 Q(pidj,pidj+1)Q(p_{id_j}, p_{id_{j + 1}}),以及每个 apidja_{p_{id_j}}1<j<i1 < j < i)的值。最初 id=[1,2]id = [1, 2],并且查询一次 Q(1,2)Q(1, 2)

sum=Q(id1,idi)sum = Q(id_1, id_i)(这可以通过已知量推出),sl=Q(id1,i+1),sr=Q(idi,i+1)sl = Q(id_1, i + 1), sr = Q(id_i, i + 1)。考虑分讨:

  • sl=max(sl,sr,sum)sl = \max(sl, sr, sum):此时 i+1i + 1 插入到 idid 最右边,apidi=sr+sumsla_{p_{id_i}} = sr + sum - sl
  • sr=max(sl,sr,sum)sr = \max(sl, sr, sum):此时 i+1i + 1 插入到 idid 最左边,apid2=sl+sumsra_{p_{id_2}} = sl + sum - sr
  • sum=max(sl,sr,sum)sum = \max(sl, sr, sum):此时可通过 slsl(或 srsr)二分出 i+1i + 1 插入在哪两个数之间,api+1=sl+srsuma_{p_{i + 1}} = sl + sr - sum,并能重新推出 i+1i + 1 与其相邻两个数的询问结果。

最后 a1,ana_1, a_n 可以直接推出,对 idid 求一个逆排列即可得到 pp。最开始询问出 Q(1,2)Q(1, 2),接下来对于 ii33nn 都询问两次,一共 2n32n - 3 次。由于此题数据范围较小,暴力插入即可通过。