关于在根的儿子原地驻扎

P1084 [NOIP2012 提高组] 疫情控制

处理假了,还有一坨跟着东西写错![](//图.tk/7),放下条好的代码: ```cpp #include<bits/stdc++.h> using namespace std; const int N=5e4+10; struct edge{ int to,w; bool operator<(const edge& x)const{return w<x.w;} }; int n,m,a[N],f[N][17],d[N][17],dep[N]; bool b[N],c[N]; vector<edge>e[N]; vector<edge>q;vector<int>o,p; void dfs(int u){ dep[u]=dep[f[u][0]]+1; for(int i=1;i<=16;i++)f[u][i]=f[f[u][i-1]][i-1]; for(int i=1;i<=16;i++)d[u][i]=d[u][i-1]+d[f[u][i-1]][i-1]; for(auto x:e[u]){ int v=x.to,l=x.w; if(v!=f[u][0])f[v][0]=u,d[v][0]=l,dfs(v); } return; } bool DFS(int u){ if(b[u])return 0; bool son=1; for(auto x:e[u]){ int v=x.to; if(v==f[u][0])continue; son=0;if(DFS(v))return 1; } if(son)return 1; return 0; } bool check(int tim){ q.clear();o.clear();p.clear(); for(int i=1;i<=n;i++)b[i]=0,c[i]=0; for(int i=1;i<=m;i++){ int k=a[i],dis=0; for(int j=16;j>=0;j--) if(f[k][j]>1&&dis+d[k][j]<=tim)dis+=d[k][j],k=f[k][j]; if(f[k][0]==1&&dis+d[k][0]<tim)q.push_back({k,tim-dis-d[k][0]}); else b[k]=1; } sort(q.begin(),q.end()); for(auto x:e[1])c[x.to]=DFS(x.to); for(int i=0;i<q.size();i++) if(c[q[i].to]&&q[i].w<d[q[i].to][0])c[q[i].to]=0;else o.push_back(q[i].w); for(auto x:e[1])if(c[x.to])p.push_back(x.w); if(o.size()<p.size())return 0; sort(o.begin(),o.end());sort(p.begin(),p.end()); int l=0,r=0; while(l<o.size()&&r<p.size())if(o[l]<p[r])l++;else l++,r++; if(r==p.size())return 1; return 0; } int Search(int l,int r){ if(l>=r)return l; int mid=l+r>>1; if(check(mid))return Search(l,mid); else return Search(mid+1,r); } signed main(){ //freopen("flu.in","r",stdin); //freopen("flu.out","w",stdout); scanf("%d",&n); for(int i=1,x,y,z;i<n;i++){ scanf("%d%d%d",&x,&y,&z); e[x].push_back({y,z});e[y].push_back({x,z}); } scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%d",&a[i]); dfs(1); if(!check(1e9))puts("-1"); else printf("%d\n",Search(1,1e9)); system("pause"); return 0; } ```
by ACRUSHj @ 2023-07-25 09:11:47


|