我是奶龙我才是奶龙
Undead2008 · · 题解
COTS 2025 题解合集
先考虑吸完尘回到
下文中的讨论不认为点
考虑对每个
然后就是不回到
#include"bits/stdc++.h"
#ifdef REANI
#include"windows.h"
using namespace std;
void SetMemoryLimit(SIZE_T MB){
HANDLE job=CreateJobObject(NULL,NULL);
assert(job!=NULL);
JOBOBJECT_EXTENDED_LIMIT_INFORMATION info={0};
info.BasicLimitInformation.LimitFlags=JOB_OBJECT_LIMIT_PROCESS_MEMORY;
info.ProcessMemoryLimit=MB;
assert(SetInformationJobObject(job,JobObjectExtendedLimitInformation,&info,sizeof(info))&&AssignProcessToJobObject(job,GetCurrentProcess()));
}
#else
using namespace std;
#endif
const int maxn = 3e5+10;
int n,q,Dg[maxn],A[maxn],Dp[maxn];
vector<int>e[maxn];
int M;
void D(int p,int Fa){
M=max(M,Dp[p]);
for(auto To:e[p]){
if(To==Fa)continue;
Dp[To]=Dp[p]+1;
D(To,p);
}
}
int main(){
#ifdef REANI
SetMemoryLimit(512*1048576);
#endif
ios::sync_with_stdio(0),cin.tie(nullptr);
cin>>n>>q;
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
Dg[u]++,Dg[v]++;
}
D(1,0);
vector<int>Db;
for(int i=1;i<=n;i++)
if(Dg[i]==1&&i!=1)
Db.push_back(i);
int S=n;
for(int i=1;i<=n;i++){
vector<int>Nw;
for(auto x:Db){
for(auto To:e[x]){
if(Dg[To]==-1)continue;
Dg[To]--;
if(Dg[To]==1&&To!=1)Nw.push_back(To);
}
Dg[x]=-1,S--;
}
Db=Nw;
A[i]=2*(n-1)+2*(S-1)-M;
}
for(int i=1,T;i<=q;i++)
cin>>T,cout<<A[T]<<' ';
cout<<'\n';
}