求 hack

P1084 [NOIP2012 提高组] 疫情控制

```cpp #include <bits/stdc++.h> using namespace std; struct edge { long long v,dis,next; }e[120000]; struct army { long long p,id,d; }a[100000]; struct node { long long d,p; }mj[100000],ms[100000]; long long n,m,u,v,w,l=0,r=100000000,ans=0,d[100000],h[100000],id[100000],s[100000],t[100000],sum[100000],book[100000],y[100000],cnt=0,tol=0; void add_edge(long long u,long long v,long long dis) { e[++cnt].next=h[u]; e[cnt].v=v; e[cnt].dis=dis; h[u]=cnt; } bool cmp1(struct army a,struct army b) { return a.id<b.id; } bool cmp2(struct army a,struct army b) { return a.d>b.d; } bool cmp3(struct node a,struct node b) { return a.d<b.d; } void dfs1(long long now,long long pre) { for(int i=h[now];i;i=e[i].next) if(e[i].v!=pre)d[e[i].v]=d[now]+e[i].dis,id[e[i].v]=id[now],dfs1(e[i].v,now); } void dfs2(long long now,long long pre) { long long cnt=0; for(int i=h[now];i;i=e[i].next) if(e[i].v!=pre)cnt++; if(cnt==1) for(int i=h[now];i;i=e[i].next) if(e[i].v!=pre)t[id[e[i].v]]=e[i].v,dfs2(e[i].v,now); } bool check(long long k) { long long pj=0,ps=0,h=1,w=1,cu=0; for(int i=1;i<=tol;i++)book[i]=0; for(int i=1;i<=m;i++) if(a[i].d-d[t[a[i].id]]<=k&&a[i].d>k)book[a[i].id]=2; else if(a[i].d<=k&&book[a[i].id])mj[++pj].d=a[i].d,mj[pj].p=0; else if(a[i].d<=k&&!book[a[i].id])book[a[i].id]=1,mj[++pj].d=a[i].d,mj[pj].p=a[i].id; for(int i=1;i<=tol;i++) if(book[i]==0)ms[++ps].d=d[s[i]],ms[ps].p=0; else if(book[i]==1)ms[++ps].d=d[s[i]],ms[ps].p=id[s[i]]; if(ps==0)return 1; sort(mj+1,mj+pj+1,cmp3); sort(ms+1,ms+ps+1,cmp3); for(int i=1;i<=ps;i++)y[ms[i].p]=i; for(int i=1;i<=pj;i++) if(mj[i].p!=0&&ps-y[mj[i].p]<i)ms[y[mj[i].p]].d=0,mj[i].d=k; sort(mj+1,mj+pj+1,cmp3); sort(ms+1,ms+ps+1,cmp3); w=ps; while(w>=1) { while(mj[h].d+ms[w].d<=k&&h<=pj)h++,cu++; if(cu==0)return 0; cu--,w--; } return 1; } int main() { scanf("%lld",&n); for(int i=1;i<=n-1;i++) { scanf("%lld%lld%lld",&u,&v,&w); add_edge(u,v,w);add_edge(v,u,w); } for(int i=h[1];i;i=e[i].next)d[e[i].v]=e[i].dis,id[e[i].v]=++tol,dfs1(e[i].v,1); for(int i=h[1];i;i=e[i].next)s[id[e[i].v]]=e[i].v,t[id[e[i].v]]=e[i].v,dfs2(e[i].v,1); scanf("%lld",&m); for(int i=1;i<=m;i++) { scanf("%lld",&a[i].p); a[i].id=id[a[i].p]; a[i].d=d[a[i].p]; sum[a[i].id]++; } if(m<tol) { printf("-1"); return 0; } sort(a+1,a+m+1,cmp1); long long cal=1; for(int i=1;i<=tol;i++) { sort(a+cal,a+sum[i]+cal,cmp2); cal+=sum[i]; } while(l<r) { long long mid=(l+r)/2; if(check(mid))ans=mid,r=mid; else l=mid+1; } printf("%lld",ans); return 0; } ```
by w9095 @ 2023-07-07 21:25:19


|