WA #1#4#7
查看原帖
WA #1#4#7
236929
Monaco楼主2021/12/4 22:28
#include<bits/stdc++.h>
using namespace std;
const int N=50005,lc=log2(N)+1; 
vector< pair<int,int> >E[N]; vector<int>X,R;
int army[N],power[N],belong[N],f[N][lc+105],l[N][lc+105],dep[N];bool stand[N];
int n; 
void dfs1(int now,int fa,int reg,int distance)
{
  //printf("now:%d fa:%d belong:%d distance:%d\n",now,fa,reg,distance);cout<<"akioinow:"<<now<<" "<<"L[2][16]:"<<l[2][16]<<endl;
  f[now][0]=fa;l[now][0]=distance;dep[now]=dep[fa]+1;belong[now]=reg;//cout<<"now:"<<now<<" "<<"L[2][16]:"<<l[2][16]<<endl;
  for(int i=1;i<=lc;++i)
    {
      //printf("Calling: node: %d lc: %d between: %d [%d->%d]:%d [%d->%d]:%d total: %d\n",now,i,f[now][i-1],now,f[now][i-1],l[now][i-1],f[now][i-1],f[f[now][i-1]][i-1],l[f[now][i-1]][i-1],l[now][i-1]+l[f[now][i-1]][i-1]);
      f[now][i]=f[f[now][i-1]][i-1],l[now][i]=l[now][i-1]+l[f[now][i-1]][i-1];
    }
  //for(int i=1;i<=lc;++i)printf("%d ",l[now][i]); puts("");
  //cout<<"now:"<<now<<" "<<"L[2][16]:"<<l[2][16]<<endl;
  for(int i=0,len=E[now].size();i<len;++i)
    { //Warning:首都初始可能有军队
      if(E[now][i].first!=fa)
	dfs1(E[now][i].first,now,reg,E[now][i].second);
    }
  
}
  pair<int,int> find(int x,int k)
{
  //cout<<"Finding: "<<"node:"<<x<<" "<<"lens:"<<k<<endl;
  //for(int i=0;i<=lc;++i) printf("%d ",l[2][i]); puts("");
  for(int i=lc;i>=0&&x!=1;--i)
    {
      if(l[x][i]<=k)/*printf("Cost: [%d] : %d->%d %d\n",i,x,f[x][i],l[x][i]),*/k-=l[x][i],x=f[x][i];
    }
//cout<<"reached:"<<x<<" left:"<<k<<endl;
  return make_pair(x,k); 
}
bool dfs2(int now,int fa)
{ if(stand[now])return true;
  // cout<<"Dfs2: "<<now<<endl;
  if(E[now].size()==1) return stand[now];
  for(int i=0,len=E[now].size();i<len;++i)
    {
      if(E[now][i].first!=fa)
	if(!dfs2(E[now][i].first,now))return false;
      
    }
  
  return stand[now]=true; 
}
bool check(int x)
{
  memset(stand,0,sizeof(stand));
  R.clear();X.clear();
  // printf("Time limited : %d\n",x);
  for(int i=1;i<=n;++i)
    {
      if(!army[i])continue;
      pair<int,int> ri=find(i,x); 
      if(ri.first==1)
	{int fi=0;
          if(ri.second<l[belong[i]][0]) stand[belong[i]]=1,fi=-1;
          //  printf(" For army #%d reached 1 time left %d\n",i,ri.second);
	  for(int j=1;j<=army[i]+fi;++j)R.push_back(ri.second); 
	}
      else /*printf(" For army #%d reached ri.first time left 0\n",ri.first),*/stand[ri.first]=1;
    }
  //for(int i=1;i<=n;++i)printf("%d ",stand[i]); puts(""); 
  dfs2(1,1);//for(int i=1;i<=n;++i)printf("%d ",stand[i]); puts(""); 
  for(int i=0,len=E[1].size();i<len;++i)
    {
      
      if(!stand[E[1][i].first])/*printf("No standing: %d\n",E[1][i].first ),*/X.push_back(E[1][i].second);
      //else printf("standing: %d\n",E[1][i].first);
    }
  sort(R.begin(),R.end()); sort(X.begin(),X.end()); int l=0; 
  for(int i=0,len=X.size();i<len;++i)
    {
      while(l<(signed)R.size()&&R[l]<X[i])++l;
      if(l==(signed)R.size())return false;
      ++l; 
    }
  return true; 
}
int main()
{
//   freopen("P1084.in","r",stdin);
//   freopen("newbie.out","w",stdout);
  power[0]=1;  int r=0;
  for(int i=1;i<=lc;++i)power[i]=power[i-1]<<1;
  cin>>n;
  if(n==1)
    {
      puts("0");
      return 0; 
    }
  for(int i=1;i<=n-1;++i)
    {
      int u,v,w;
      cin>>u>>v>>w;
      E[u].push_back(make_pair(v,w));
      E[v].push_back(make_pair(u,w));r+=w; 
    }
  int m;
  cin>>m;
  for(int i=1;i<=m;++i)
    {
      int t;
      cin>>t;
      ++army[t];
    }
  for(int i=0;i<=lc;++i)f[1][i]=1;
  belong[1]=1;
  for(int i=0,len=E[1].size();i<len;++i)f[E[1][i].first][0]=1,dfs1(E[1][i].first,1,E[1][i].first,E[1][i].second);
  //printf("SB: %d %d %d\n",l[2][0], l[2][1],l[2][2]); 
  int l=0,ans=2100000000;
  while(l<=r)
    {
      int mid=(l+r)>>1;
      if(check(mid))ans=mid,r=mid-1;
      else l=mid+1;
    }
  if(ans==111111111) ans=-1; 
  printf("%d\n",ans);
  return 0; 
}

现有hack都过了,然而数据只有70分

bug自动机

2021/12/4 22:28
加载中...