关于
int l=0,r=50000000000000,ans=-1;
如果把二分上界设成5e13,wa7
设成5e16,wa5
设成5e12,wa10
设成5e15,wa5和7
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define I inline
#define noe noelle
#define nnq nanachi
#define int __int128
using namespace std;
const int N = 1001000;
struct node {
int to,val;
node(int tt=0,int vv=0) {
to=tt; val=vv;
}
};
struct jd {
int rev,num;
jd(int rr=0,int nn=0) {
rev=rr; num=nn;
}
};
bool vis[N],cant[N];
jd ok[N];
int ned[N];
int n,m,lcnt,dis[N],leaf[N],leafhav[N],leafok[N],top[N],pos[N],f[N][21],mkval[N];
vector<node> q[N];
I bool cmp(int n1,int n2) {
return mkval[n1]>mkval[n2];
}
I bool cmp2(jd j1,jd j2) {
return j1.rev>j2.rev;
}
void dfs(int x,int fa) {
if(fa&&q[x].size()==1) leaf[++lcnt]=x;
f[x][0]=fa;
for(int i=0;i<=19;++i) f[x][i+1]=f[f[x][i]][i];
for(int i=0;i<q[x].size();++i) {
int to=q[x][i].to,val=q[x][i].val;
if(to==fa) continue;
dis[to]=dis[x]+val;
dfs(to,x);
}
}
I int find(int x,int ndis) {
int mk=x;
for(int i=20;i>=0;--i) {
if(!f[x][i]||dis[mk]-dis[f[x][i]]>ndis) continue;
x=f[x][i];
}
// cout<<mk<<' '<<x<<' '<<ndis<<"nsnschi"<<endl;
return x;
}
void dealtop(int x,int fa,int tp) {
top[x]=tp;
for(int i=0;i<q[x].size();++i) {
int to=q[x][i].to;
if(to==fa) continue;
dealtop(to,x,tp);
}
}
void trans(int x) {
if(q[x].size()==1&&x!=1&&!vis[x]) leafok[top[x]]++;
vis[x]=1;
for(int i=0;i<q[x].size();++i) {
int to=q[x][i].to;
if(to==f[x][0]) continue;
if(!vis[to]) trans(to);
}
}
I bool check(int t) {
memset(vis,0,sizeof(vis));
memset(cant,0,sizeof(cant));
memset(leafok,0,sizeof(leafok));
int nedcnt=0,okcnt=0;
for(int i=1;i<=m;++i) {
int now=pos[i];
if(leafok[now]==leafhav[now]&&dis[now]<t) ok[++okcnt]=jd(t-dis[now],now); //ok[++okcnt]=jd(t-dis[now],top[now]);
else if(leafok[now]!=leafhav[now]&&dis[now]+mkval[top[now]]<=t) ok[++okcnt]=jd(t-dis[now],now);
else {
int mk=find(now,t);
if(mk==1) mk=top[now];
trans(mk);
}
}
for(int i=1;i<=lcnt;++i) {
if(vis[leaf[i]]) continue;
if(!cant[top[leaf[i]]]) cant[top[leaf[i]]]=1,ned[++nedcnt]=top[leaf[i]];
}
sort(ok+1,ok+1+okcnt,cmp2);
sort(ned+1,ned+1+nedcnt,cmp);
// cout<<"tim:"<<t<<endl;
// for(int i=1;i<=n;++i) cout<<leafok[i]<<' '; cout<<endl;
// for(int i=1;i<=okcnt;++i) cout<<ok[i].rev<<' '; cout<<endl;
// for(int i=1;i<=nedcnt;++i) cout<<"aa"<<ned[i]<<' '; cout<<endl;
int j=1;
for(int i=1;i<=nedcnt;++i) {
while(j<=okcnt&&ok[j].rev<mkval[ned[i]]) j++;
if(j>=okcnt+1) return false;
j++;
}
return true;
}
void print(int x) {
if(x>=10) print(x/10);
putchar(x%10+'0');
}
I int read() {
int ret=0,w=1; char ch;
while((ch=getchar())>'9'||ch<'0'&&ch!='-'); if(ch=='-') w=-1; else ret=ch-'0';
while((ch=getchar())>='0'&&ch<='9') ret=ret*10+ch-'0';
return ret*w;
}
signed main()
{
n=read();
for(int i=1;i<n;++i) {
int x,y,z; x=read(); y=read(); z=read();
q[x].push_back(node(y,z));
q[y].push_back(node(x,z));
}
m=read(); dfs(1,0);
for(int i=1;i<=m;++i) pos[i]=read();
for(int i=0;i<q[1].size();++i) dealtop(q[1][i].to,1,q[1][i].to),mkval[q[1][i].to]=q[1][i].val;
for(int i=1;i<=lcnt;++i) leafhav[top[leaf[i]]]++;
int l=0,r=50000000000000,ans=-1;
while(l<=r) {
int mid=l+r>>1;
// cout<<l<<' '<<r<<' '<<mid<<endl;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
if(ans<0) cout<<"-1"<<endl;
else print(ans),putchar('\n');
// for(int i=1;i<=lcnt;++i) cout<<leaf[i]<<' '; cout<<endl;
// for(int i=1;i<=n;++i) cout<<leafhav[i]<<' '; cout<<endl;
// for(int i=1;i<=n;++i) cout<<mkval[i]<<' '; cout<<endl;
return 0;
}
这是为什么呢QAQ