思路:
快速计算出每只虫子在食物降临后的位置(以食物节点为根)。
第一遍 DFS:计算每个节点 k 步后被贪吃虫 w 占据。
第二遍 DFS:计算贪吃虫 w 走 t 步到 pos 停止。
搜索到节点 u ,若最先占据该点的虫子 w 没有被访问过,则此处为虫子的最后落脚点,并把该虫子标记为已访问。
AC代码:
#include<bits/stdc++.h>
const int N=5015,K=1003;
int n,hd[N],nx[N*2],vt[N*2],cnt,k,psw[N],ans[K];
void add(int u,int v){++cnt;nx[cnt]=hd[u];vt[cnt]=v;hd[u]=cnt;}
int occ[N],tim[N],last[K],cpos[K],opos[K];
void formtree(int u,int fa){
int nwrm,ntim,vwrm,vtim;
if(psw[u])nwrm=psw[u],ntim=0;
else nwrm=9999,ntim=9999;
for(int i=hd[u];i;i=nx[i])if(vt[i]!=fa){
formtree(vt[i],u);vwrm=occ[vt[i]],vtim=tim[vt[i]]+1;
if(vtim<ntim||(vtim==ntim&&vwrm<nwrm))nwrm=vwrm,ntim=vtim;
}
occ[u]=nwrm;tim[u]=ntim;
}
void scantree(int u,int fa){
int wmcu