10.31 联测

早读,但是开始复习大联盟。


A

盲猜一波,图合法当且仅当图联通,两边对称,对角线为零。

发现这样会漏判一些不合法,跑一遍 checker 特判一下即可。

傻逼 checker 浪费我 30min。


B

fi,j,kf_{i,j,k} 表示当前在是第 ii 分钟,摸过 jj 分钟鱼,上一次摸鱼在 iki-k 分钟。

转移大概是分下一分钟摸不摸鱼,以及把上一个作业的信息继承。

时间复杂度大概是 O(nqqTT)O(nq\frac qT T),很能过啊。


C

赛时不会。

貌似和 CTSC2018 暴力写挂 是一个 trick。

把询问挂在第一颗树上,并对第一棵树边分治。

设当前分治的边为 ee,处理的询问为 (u,v)(u,v)

u,xu,x 分别在边的两侧,设 xSx\in S

ans=maxx{du+we+dx+dist2(x,v)}ans=\max_x \{d_u+w_e+d_x+dist_2(x,v)\}

两边配平一下 ans=maxx{dudv+we+(dv+dx+dist2(v,x))}ans=\max_x \{d_u-d_v+w_e+(d_v+d_x+dist_2(v,x))\}

括号外面是一个定值,括号里面是定点到点集的最大距离的形式。

可以建虚树,但是还有一个更聪明的办法。

结论:找到点集 SS 在第二棵树上的直径,设为 (U,V)(U,V),则 x{U,V}x\in \{U,V\}

证明:和树的直径证明类似,在端点处加上 dxd_x 没有本质区别。

所以找到 SS 中的直径后,用 dU+dist2(v,U),dV+dist2(v,V)d_U+dist_2(v,U),d_V+dist_2(v,V) 中的较大值更新答案即可。

使用 O(nlogn)O(1)O(n\log n)-O(1) lca,可以做到 O(nlogn)O(n\log n)


D

挺好的一题,代码先咕着。

ii 后面第一个满足 pj>pip_j>p_ijjnxtinxt_i

如果当前在 ii,且目的地 jnxtij \ge nxt_i,显然 nxtinxt_i 是一定会被到达的(无论使用哪种操作)。

由于 iinxtinxt_i 不一定使用 2 操作。所以,预处理 fif_i 表示 ii 走到 nxtinxt_i 的最小代价。

把每个 [i,nxti)[i,nxt_i) 画出来,形成的区间要么相交,要么包含。

套路的建出一颗 nn 个节点的树,节点 uu 表示区间 [u,nxtu)[u,nxt_u)

我们要求 cost(x,y)cost(x,y) 表示 xxyy 的最小代价,考虑树上哪些点会产生贡献。

img

套用一下讲题人的图。

根据图片不难用树上前缀和维护。