0%

现代汽车前瞻杯-2025牛客暑期多校训练营3 ——Head out to the Target

思路讲解

我们赛时设计了一个算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vll siz(N+5,0);
vector<pll> nodes(N+5,{0,0});
FOR(i,1,K){
ll u,l,r;
cin>>u>>l>>r;
siz[u]=r-l+1;
nodes[u]={l,r};
}
function<void(ll)> dfs=[&](ll u)->void{
for(auto &v:g[u]){
dfs(v);
siz[u]+=siz[v];
}
};

但是这个算法只能判断可达性(或者可达性都有点问题),瓶颈在于这个算法并不在乎达到该节点的时间。

那么有没有办法让这个算法在乎时间那?其实也简单,在该时间内,该树只有之前能到达的点。

1
2
3
4
5
6
7
8
9
10
11
ll mn=min(time,dis);
ll v=tr.findk(u,dis-mn);
if(v==u){ // 找到可到达点
ll ans=dis+l-1;
cout<<ans<<"\n";
return;
}
while(v!=low){ // 溯源路径,给路径上面所有点打上OK标记
tr.OK[v]=true;
v=tr.fa[v][0];
}

AC代码

心路历程(WA,TLE,MLE……)