信競轉生~到了文化課就拿出真本事~
TrenchGenius · · 生活·游记
赛前一天连封两号无敌了。
我是你🐖哥哥,
紧张哭了。
T1
你将数组排序后,一段区间的花销为
那么移动右端点,左端点不停向有移动,直接做就可以了。
T2
考虑到每条路线内部不会花费任何代价,那么你可以对于每个站,得出从一条经过路线到另一条线路之间交换的最小代价。
那么这个可以直接 dij 求。
然后询问枚举从哪一条线路出发和结束。
T3
在此之前我们用双指针计算一个点能直接到的最右边的点
考虑 dp,
- 我们认为我们不能通过任何一条非最优线路到达当前点。
- 我们要求至今为止我们可以以两条路径即
l_{l_{\cdots _x-1}},\cdots,l_{x-1},x-1 ,和l_{l_{\cdots _x}},\cdots,l_{x},x 。 - 我们已经经过了
1的部分,同时约束变为和0 相同。
我们发现路线一定是
那么转移有以下,边界情况自视:
-
-
-
-
-
f(r_x,2)\leftarrow f(x,2)$ 当且仅当 $r_{x-1}\neq r_x
这是显然的,求答案部分则仅允许
花了大概
中途花时间在
T4
发现我们难以考虑两连通块存在祖先关系的情况。
想了很久的暴力,但是始终没有
我们考虑将根换为直径中心,那么存在一个性质“两个连通块的根要么是这个根,要么在不同的两个子树中”,这是显然的。
尝试二分答案,使得一个距离合法的条件是:假设一个在
考虑对于每一个子树得到其中每一个节点的
val
好求,考虑
len
这个看起来难求,试图遍历一棵树,我们不妨拆开看
我们已经对于一个子树求出了这些信息。
考虑后面一个式子,当我们选取
具体而言,我们加入一个节点时,(
for([x,len,val,g]) {
if(x==mx)
Tdemx.modify(trimx+g<=mid?len:max(trimx,len),val);
Tnone.modify(demx+g<=mid?len:max(demx,len),val);
if(x==demx) {
Tmx.modify(trimx+g<=mid?len:max(trimx,len),val);
Tnone.modify(mx+g<=mid?len:max(mx,len),val);
}
if(x!=mx&&x!=demx) {
Tmx.modify(demx+g<=mid?len:max(demx,len),val);
Tnone.modify(mx+g<=mid?len:max(mx,len),val);
Tdemx.modify(mx+g<=mid?len:max(mx,len),val);
}
}
以及询问:
[x,len,val,g]
if(x==mx)
if(Tmx.query(0,g)<=k-val)
return true;
if(x==demx)
if(Tdemx.query(0,g)<=k-val)
return true;
if(x!=mx&&x!=demx)
if(Tnone.query(0,g)<=k-val)
return true;
那么根据不可能互补的性质,我们只需要正反做两遍就可以得出每一种情况。
一种特殊的情况是
这就是精神 385 的全部部分。
注意到你有七八成概率写完
但是去看我