你们没有T最后一个点的么?求助
查看原帖
你们没有T最后一个点的么?求助
952033
lutaoquan2012楼主2025/7/27 11:50
//
// Created by 55062 on 2025/7/27.
//
#include<bits/stdc++.h>

using namespace std;
typedef __int128_t int128;
typedef __int128_t ll;
int128 read(){
    int128 x=0; bool f = 0; char c = getchar();
    while (c < '0'|| c > '9') { if (c == '-') f = 1; c = getchar(); }
    while (c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); }
    return f ? -x : x;
}
inline void write(int128 x){
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
ll n,m,x,w,y,z,dep[500010], anc[500010][20],dis[500010],diff[500010];
struct node{
    ll v,w;
};
vector<node> v[300010];
struct D{
    ll u,v,x,lca;
}a[500010];
void dfs1(ll x, ll fa,ll w) {
    dep[x] = dep[fa] + 1;
    anc[x][0] = fa;
    dis[x] = dis[fa] + w;
    for (int i = 1; i <= 17; i++) anc[x][i] = anc[anc[x][i - 1]][i - 1];
    for (int i = 0; i < v[x].size(); i++) {
        if (v[x][i].v != fa) dfs1(v[x][i].v, x,v[x][i].w);
    }
}

ll lca(ll x, ll y) {
    if (dep[x] < dep[y])swap(x, y);
    for (int i = 16; i >= 0; i--)
        if (dep[anc[x][i]] >= dep[y]) x = anc[x][i];
    if (x == y) return y;
    for (int i = 16; i >= 0; i--)
        if (anc[x][i] != anc[y][i]) {
            x = anc[x][i];
            y = anc[y][i];
        }
    return anc[x][0];
}
bool cmp(D x,D y){
    return x.x>y.x;
}
void dfs(ll u, ll father) {
    for (int i = 0; i < v[u].size(); i++) {
        if (v[u][i].v != father) {
            dfs(v[u][i].v, u);
            diff[u] += diff[v[u][i].v];
        }
    }
}
bool check(ll mid){
    memset(diff, 0, sizeof(diff));
    ll b = 0;
    for (int i = 1; i <= m; i++) {
        if (a[i].x <= mid) break;
        diff[a[i].u]++;
        diff[a[i].v]++;
        diff[a[i].lca] -= 2;
        b++;
    }dfs(1,0);
    ll maxx=0;
    for(int i=1;i<=n;i++)
        if(diff[i]==b)
            for(int k=0;k<v[i].size();k++)
                if(v[i][k].v==anc[i][0]){maxx=max(maxx,v[i][k].w);break;}
    return a[1].x-maxx<=mid;
}
int main() {
    n=read(),m=read();
    for(int i=1;i<n;i++){
        x=read(),y=read(),z=read();
        w=max(w,z);
        v[x].push_back({y,z});
        v[y].push_back({x,z});
    }dfs1(1,0,0);
    for(int i=1;i<=m;i++){
        x=read(),y=read();
        ll z=lca(x,y);
        a[i].u = x;
        a[i].v = y;
        a[i].lca = z;
        a[i].x = dis[x] + dis[y] - 2 * dis[z];
    }sort(a+1,a+m+1,cmp);
    ll l=a[1].x-w,r=a[1].x,ans=0;
    while(l<=r){
        ll mid=(l+r)/2;
        if(check(mid)==true){
            r=mid-1;
            ans=mid;
        }else l=mid+1;
    }write(ans);
    return 0;
}
2025/7/27 11:50
加载中...