WA 60求调
查看原帖
WA 60求调
598275
_lgh_楼主2024/1/7 14:49
#include <bits/stdc++.h>
using namespace std;
const int maxn=300010;
typedef long long ll;
typedef pair<ll,ll> pr;
struct node {
    int x,y;
    ll z;
};
#define int long long
#define mp make_pair
#define mt(x,y,z) (node){x,y,z}
#define pb push_back
int n,m;
vector<pr>e[maxn];
int dfn[maxn],cnt,mx[maxn][20],fa[maxn];
ll dis[maxn];
node plan[maxn],edge[maxn];
ll c[maxn];
void dfs(int x,int f) {
    mx[dfn[x]=++cnt][0]=f;
    for(auto it:e[x]) if(it.first!=f) fa[it.first]=x,dis[it.first]=dis[x]+it.second,dfs(it.first,x);
}
ll R;
int get(int x,int y) {
    return dfn[x]<dfn[y]?x:y;
}
int lca(int x,int y) {
    if(x==y) return x;
    if((x=dfn[x])>(y=dfn[y])) swap(x,y);
    int k=__lg(y-x);x++;
    return get(mx[x][k],mx[y-(1<<k)+1][k]);
}
void Init() {
    int k=__lg(n);
    for(int j=1; j<=k; j++)
        for(int i=1; i+(1<<j)-1<=n; i++)
            mx[i][j]=get(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
}
ll getdis(int x,int y) {
    return dis[x]+dis[y]-2*dis[lca(x,y)];
}
bool check(int mid) {
    for(int i=1; i<=n; i++) c[i]=0;
    int sum=0,ans=0;
    for(int i=1; i<=m; i++) if(plan[i].z>mid) c[plan[i].x]++,c[plan[i].y]++,c[lca(plan[i].x,plan[i].y)]-=2,sum++,ans=max(ans,plan[i].z-mid);
    if(sum==0) return 1;
    for(int i=n; i; i--) c[fa[dfn[i]]]+=c[dfn[i]];
    for(int i=2; i<=n; i++) if(dis[dfn[i]]-dis[fa[dfn[i]]]>=ans&&c[i]==sum) return 1;
    return 0;
}
signed main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    ll l,r,ans=-1,L=0;
    for(ll i=1,u,v,w; i<n; i++) cin>>u>>v>>w,e[u].pb(mp(v,w)),e[v].pb(mp(u,w)),r+=w,edge[i]=mt(u,v,w),L=max(L,w);
    dfs(1,0);
    Init();
    for(int i=1,x,y; i<=m; i++) cin>>x>>y,plan[i]=mt(x,y,getdis(x,y)),R=max(R,getdis(x,y));
    l=0,r=1e9;
    while(l<=r) {
        ll mid=(l+r)/2;
        if(check(mid)) r=mid-1,ans=mid;
        else l=mid+1;
    }
    cout<<ans<<'\n';
    return 0;
}

WA on 2,3,4,9,13,14,19,20.

2024/1/7 14:49
加载中...