悬赏 5元 求调
查看原帖
悬赏 5元 求调
246331
mystic_qwq楼主2024/6/8 20:38

支持微信,希望大佬调我的代码(

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=5e4+1,M=N,Lg=log2(N)+1;
int n,m;
vector<int> P[N];
vector<pair<int,int>> G[N];
void add(int u,int v,int w){
  G[u].pb({v,w}),G[v].pb({u,w});
  P[u].pb(v),P[v].pb(u);
}
struct Camp{
  int id,w;
  bool operator<(Camp&a)const{
    return w>a.w?1:0;
  }
};
vector<Camp> camp;
using ll=long long;
struct Bin{
  ll t; int p,b; // time, pos, belong to which subtree rooted as 1's son
  bool operator<(Bin&a)const{
    return t>a.t?1:0;
  }
}bin[M],org[M];
bool mark[N];
bool chktree(int u,int fa){
  //printf("check %d %d\n",u,fa);
  if(mark[u]) return 1;
  for(int v:P[u])
    if(v!=fa&&!chktree(v,u)) return 0;
  return P[u].size()>1;
}
int f[N][Lg]; ll g[N][Lg];
void dfs0(int u,int fa){
  for(auto[v,w]:G[u])if(v!=fa)
    f[v][0]=u,g[v][0]=w,dfs0(v,u);
  for(int i=1;i<=log2(n);++i){  
    f[u][i]=f[f[u][i-1]][i-1],
    g[u][i]=g[u][i-1]+g[f[u][i-1]][i-1];
  }
}
int Bel[N];
void Mark(int x,int u,int fa){
  Bel[u]=x;
  for(int v:P[u]) if(v!=fa) Mark(x,v,u);
}
ll l=0,r=1e18,lim;
void getpos(Bin&bbin){
  auto&[t,p,b]=bbin;
  for(int i=log2(n);~i;--i){
    if(g[p][i]<=lim-t) 
      t+=g[p][i],p=f[p][i];
  }
  if(!p) p=1;
}
bool used[N];
bool check(){
  //cout<<"lim="<<lim<<'\n';
  camp.clear();
  memset(mark+1,0,n<<2);
  vector<Bin> bin0;
  /*cout<<"Bin:";*/for(int i=1;i<=m;++i){ 
    getpos(bin[i]=org[i]);
    if(bin[i].p!=1) mark[bin[i].p]=1;
    else bin0.push_back(bin[i]);
    //cout<<"(pos.time.belong)=("<<bin[i].p<<bin[i].t<<bin[i].b<<")\n";
  }
  for(auto[v,w]:G[1]) if(!chktree(v,1)) camp.pb({v,w});
  //printf("uncleared camp:");for(auto[x,w]:camp) cout<<x<<' ';cout<<'\n';
  sort(bin0.begin(),bin0.end()),sort(camp.begin(),camp.end());
  memset(used,0,bin0.size());
  for(auto[v,w]:camp){ 
  for(int i=0;i<bin0.size();++i){ 
    //printf("rep:%d\n",i);
    if(!used[i]){ 
      auto[t,p,b]=bin0[i];
      //printf("BIN(t,p,b) v,w (%lld,%d,%d) %d,%d\n",t,p,b,v,w);
      if((lim-t<w&&b==v)||lim-t>=w) {used[i]=1;goto _;}
    }
  }
  return 0;_:;
  }
  return 1;
}
main(){
  freopen("P1084_3.in","r",stdin);
  cin>>n;
  ll rr=0;
  for(int u,v,w,i=1;i<n;++i)
    cin>>u>>v>>w,add(u,v,w),rr+=w;
  for(int v:P[1]) Mark(v,v,1); dfs0(1,0);
  //printf("mark:");for(int i=1;i<=n;++i)cout<<Bel[i]<<" \n"[i==n];
  //printf("data:");for(int j=1;j<=n;++j,puts(""))for(int i=0;i<=log2(n);++i)cout<<f[j][i]<<' '<<g[j][i]<<' ';
  cin>>m;
  for(int i=1;i<=m;++i)
    cin>>org[i].p,org[i].b=Bel[org[i].p];
  r=rr;
  //for(l=0;l<=10;++l){ lim=l;if(check()) exit(printf("%d",l)&0);}
  while(l<=r) /*printf("l=%lld r=%lld\n",l,r),*/lim=l+r>>1,check()?r=lim-1:(l=lim+1);
  if(r==rr) cout<<"-1\n"; else cout<<r+1<<'\n';
}

2024/6/8 20:38
加载中...