有哪位大佬可以说说 #8 是为什么会 WA 吗?/kel
或者不用管我写了什么东西,说说 #8 数据卡了什么可以吗?/kel
#include<iostream>
#include<cstdio>
#include<vector>
#include<bitset>
#include<algorithm>
//#define int long long
#define ll long long
#define pb emplace_back
#define il inline
#define cerr if(0)cerr
using namespace std;
struct edge{int v;ll w;};
struct army{ll d;int id;};
const int MAXN=5e4+5,MAXlg=16+2; //15.6098
int n,m;
vector <edge> p[MAXN];
int a[MAXN],b[MAXN],fa[MAXN][MAXlg],tot;
ll dep[MAXN],res[MAXN];
vector <army> sp;
vector <int> nd;
bitset <MAXN> ckd,use;
army nst[MAXN];
il void dfs(int u,int ufa)
{
fa[u][0]=ufa;
for(edge i:p[u])
{
if(i.v==ufa) continue;
dep[i.v]=dep[u]+i.w;
dfs(i.v,u);
}
}
il void init_fa()
{
for(int i=1;i<=16;++i)
for(int j=1;j<=n;++j)
fa[j][i]=fa[fa[j][i-1]][i-1];
}
il int query(int u,ll lim)
{
for(int i=16;i>=0;--i)
if(dep[u]-dep[fa[u][i]]<=lim && fa[u][i]>1)
u=fa[u][i];
return u;
}
il bool dfs2(int u,int ufa)
{
if(ckd[u]) return 1;
if(p[u].size()==1 && p[u][0].v==ufa) return 0;
int cnt=0;
for(edge i:p[u])
{
if(i.v==ufa) continue;
if(dfs2(i.v,u)) ++cnt;
}
if(cnt==p[u].size()-1) ckd[u]=1;
return ckd[u];
}
il bool check(ll x)
{
cerr<<"------------------- "<<x<<'\n';
for(int i=1;i<=m;++i) b[i]=query(a[i],x),res[i]=x-(dep[a[i]]-dep[b[i]]);
vector<army>().swap(sp),vector<int>().swap(nd);
ckd&=0,use&=0;
for(edge i:p[1]) nst[i.v].d=(ll)(9e18),nst[i.v].id=-1;
for(int i=1;i<=m;++i)
{
if(fa[b[i]][0]==1)
{
//cerr<<"+";
if(res[i]-dep[b[i]]>=0) sp.pb((army){res[i]-dep[b[i]],i});
if(res[i]-dep[b[i]]<nst[b[i]].d) nst[b[i]]=(army){res[i]-dep[b[i]],i};
}
else ckd[b[i]]=1;
}
sort(sp.begin(),sp.end(),[](const army a,const army b)
{
return a.d>b.d;
});
cerr<<ckd[8]<<ckd[7]<<ckd[4]<<'\n';
cerr<<"{sp} ";for(army i:sp) cerr<<"("<<i.d<<" "<<i.id<<") ";cerr<<'\n';
dfs2(1,0);
for(edge i:p[1])
if(!ckd[i.v]) nd.pb(i.v);
sort(nd.begin(),nd.end(),[](const int a,const int b)
{
return dep[a]>dep[b];
});
cerr<<"{nd} ";for(int i:nd) cerr<<i<<' ';cerr<<'\n';
cerr<<"{nst} ";for(int i:nd)cerr<<"("<<i<<" "<<"{"<<nst[i].d<<","<<nst[i].id<<"}"<<") ";cerr<<'\n';
int j=0;
for(int i:nd)
{
if(nst[i].id>0 && !use[nst[i].id]) use[nst[i].id]=1;
else
{
while(j<sp.size() && use[sp[j].id]) ++j;
if(j==sp.size() || sp[j].d<dep[i]) return 0;
use[sp[j++].id]=1;
}
}
return 1;
}
signed main()
{
ios::sync_with_stdio(0);
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n;
int _u,_v;ll _w,l=0,r=0,mid;
for(int i=1;i<=n-1;++i)
{
cin>>_u>>_v>>_w;
p[_u].pb((edge){_v,_w});
p[_v].pb((edge){_u,_w});
if(_u==1 || _v==1) ++tot;
r+=_w;
}
cin>>m;
for(int i=1;i<=m;++i) cin>>a[i];
if(tot>m){cout<<-1; return 0;}
dfs(1,0);
init_fa();
//cerr<<"{dep} ";for(int i=1;i<=n;++i) cerr<<dep[i]<<' ';cerr<<'\n';
//cerr<<check(9);return 0;
bool res;
r+=10ll;
while(l+1ll<r)
{
mid=(l+r)>>1;
res=check(mid);
cerr<<"check result is "<<mid<<' '<<res<<"\n\n";
if(res) r=mid;
else l=mid;
}
cout<<r;
return 0;
}
(不要管我代码里面的cerr喵)