50分……
查看原帖
50分……
569702
_xxy_楼主2023/1/5 16:44

WA on #4,6,7,8,9 qwq

调到后面思路都乱了,找不出问题。

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
inline int read(){
    int x=0,f=1;
    char ac=getchar();
    while(ac<'0'||ac>'9'){
        if(ac=='-') f=-1;
        ac=getchar();
    }
    while(ac>='0'&&ac<='9'){
        x=(x<<3)+(x<<1)+(ac-'0');
        ac=getchar();
    }
    return x*f;
}
struct ac{
    int to,sum;
}xz[50005];
bool operator <(ac a,ac b){
    return a.sum<b.sum;
}
std::vector<ac> edge[50005];
int n,m,army[50005],fa[50005][20],logg[50005],dis[50005],nextneed[50005];
long long l,r,ans,dis2[50005][20],nexttim[50005];
bool p,cant[50005],need[50005];
void dfs1(int u,int f){
    for(int i=1;i<=logg[dis[u]];i++){
        fa[u][i]=fa[fa[u][i-1]][i-1];
        dis2[u][i]=dis2[u][i-1]+dis2[fa[u][i-1]][i-1];
    } 
    int len=edge[u].size();
    for(int i=0;i<len;i++){
        if(edge[u][i].to==f) continue;
        fa[edge[u][i].to][0]=u;
        dis2[edge[u][i].to][0]=edge[u][i].sum;
        dis[edge[u][i].to]=dis[u]+1;
        dfs1(edge[u][i].to,u);
    }
}
bool dfs2(int u,int f){
    if(cant[u]){
        return 1;
    }
    int len=edge[u].size();
    if(len==1) return 0;
    for(int i=0;i<len;i++){
        if(edge[u][i].to==f) continue;
        if(!dfs2(edge[u][i].to,u)) return 0;
    }
    return 1;
}
bool check(long long x){
    memset(xz,0,sizeof(xz));
    memset(cant,0,sizeof(cant));
    memset(need,0,sizeof(need));
    memset(nexttim,0,sizeof(nexttim));
    memset(nextneed,0,sizeof(nextneed));
    int cnt1=0,cnt2=0,cnt3=0;
    for(int i=1;i<=m;i++){
        long long now=army[i],usetime=0;
        for(int j=logg[dis[army[i]]];j>=0;j--){
            if(fa[now][j]>1&&usetime+dis2[now][j]<=x){
                now=fa[now][j];
                usetime+=dis2[now][j];
            }
        }
        if(fa[now][0]==1&&usetime+dis2[now][0]<=x){
            xz[++cnt1].to=now;
            xz[cnt1].sum=x-usetime-dis2[now][0];
        }
        else cant[now]=true;
    }
/*    printf("%lld\n",x);
    for(int i=1;i<=cnt1;i++){
        printf("%d %lld\n",xz[i].to,xz[i].sum);
    }
    printf("\n");*/
    int len=edge[1].size();
    for(int i=0;i<len;i++){
        if(!dfs2(edge[1][i].to,1)) need[edge[1][i].to]=1;
    }
    std::sort(xz+1,xz+cnt1+1);
    for(int i=1;i<=cnt1;i++){
        if(need[xz[i].to]&&xz[i].sum<dis2[xz[i].to][0]) need[xz[i].to]=0;
        else{
            nexttim[++cnt2]=xz[i].sum;
        }
    }
    for(int i=0;i<len;i++){
        if(need[edge[1][i].to]) nextneed[++cnt3]=dis2[edge[1][i].to][0];
    }
    if(cnt2<cnt3) return 0;
    std::sort(nexttim+1,nexttim+cnt2+1);
    std::sort(nextneed+1,nextneed+cnt3+1);
/*    for(int i=1;i<=cnt2;i++) printf("%lld\n",nexttim[i]);
    printf("\n");
    for(int i=1;i<=cnt3;i++) printf("%d\n",nextneed[i]);
    printf("\n");*/
    int cnt4=1;
    for(int i=1;i<=cnt2;i++){
        if(nexttim[i]>=nextneed[cnt4]){
            cnt4++;
            if(cnt4>cnt3) return 1;
        }
    }
    return 0;
}
int main(){
    n=read();
    for(int i=1;i<n;i++){
        int u=read(),v=read(),w=read();
        edge[u].push_back((ac){v,w});
        edge[v].push_back((ac){u,w});
        r+=w;
    }
    logg[1]=0;
    for(int i=2;i<=n;i++) logg[i]=logg[i>>1]+1;
    dfs1(1,0);
    /*for(int i=1;i<=n;i++){
        for(int j=0;j<=logg[dis[i]];j++){
            printf("%lld %lld\n",fa[i][j],dis2[i][j]);
        }
        printf("\n");
    }*/
    m=read();
    for(int i=1;i<=m;i++){
        army[i]=read();
    }
    while(l<=r){
        long long mid=l+r>>1;
        if(check(mid)){
            ans=mid;
            r=mid-1;
            p=true;
        }
        else l=mid+1;
    }
    if(p) printf("%lld",ans);
    else printf("-1");
    return 0;
}
2023/1/5 16:44
加载中...