是这题卡vector还是我哪里写的有问题,50分
查看原帖
是这题卡vector还是我哪里写的有问题,50分
214853
Mecci_miaowu楼主2021/6/20 17:04
#include<bits/stdc++.h>
#define gc getchar()
#define reg register
using namespace std;
typedef long long ll;
inline ll read(){
	reg ll res = 0, k = 1;
	reg char ch = gc;
	while(ch < '0' || ch > '9'){
		if(ch == '-')k=-1;
		ch = gc;
	}
	while(ch >= '0' && ch <= '9'){
		res = res * 10 + ch - '0';
		ch = gc;
	}
	return res * k;
}

struct Pair{int first, second;};
vector<Pair>p[300000 + 5];
int n, m;
int dis[300000 + 5];

int lg[300000 + 5];
inline void getlg(){
    for(reg int i = 2 ; i <= n ; ++i)
        lg[i] = lg[i / 2] + 1;
}

int fa[300000 + 5][105];
int dep[300000 + 5];
int _dep[300000 + 5];
int val[300000 + 5];
int dnf[300000 + 5];
int tot = 1;

inline void dfs(reg int id, reg int fath, reg int v){
    dnf[tot++] = id;
    fa[id][0] = fath;
    dep[id] = dep[fath] + 1;
    _dep[id] = _dep[fath] + v;
    val[id] = v;
    for(reg int i = 1 ; i <= lg[dep[id]] ; ++i)
        fa[id][i] = fa[fa[id][i - 1]][i - 1];
    for(reg int i = 0 ; i < p[id].size() ; ++i){
        if(p[id][i].first == fath)
            continue;
        dfs(p[id][i].first, id, p[id][i].second);
    }
}

inline int lca(reg int a, reg int b){
    if(dep[a] < dep[b])
        swap(a, b);
    while(dep[a] != dep[b])
        a = fa[a][lg[dep[a] - dep[b]]];
    if(a == b)
        return a;
    for(reg int i = dep[a] ; i >= 0 ; --i)
        if(fa[a][i] != fa[b][i])
            a = fa[a][i],
            b = fa[b][i];
    return fa[a][0];
}

inline void add(reg int a, reg int b){
    ++dis[a];
    ++dis[b];
    dis[lca(a, b)] -= 2;
}

int a[300000 + 5], b[300000 + 5], road[300000 + 5];
int L, R;

inline bool check(reg int mid){
    memset(dis, 0, sizeof(dis));
    reg int cnt = 0;
    for(reg int i = 1 ; i <= m ; ++i){
        if(road[i] > mid){
            add(a[i], b[i]);
            ++cnt;
        }
    }
    for(reg int i = n ; i >= 1 ; --i){
        dis[fa[dnf[i]][0]] += dis[dnf[i]];
        if(val[dnf[i]] >= R - mid && dis[dnf[i]] == cnt)
            return 1;
    }
    return 0;
}

int main(){
	n = read(), m = read();
    for(reg int i = 1 ; i <= n - 1 ; ++i){
        reg int a = read(), b = read(), t = read();
        p[a].push_back((Pair){b, t});
        p[b].push_back((Pair){a, t});
        L = max(L, t);
    }
    dfs(1, 0, 0);
    reg int l, r = -1;
    for(reg int i = 1 ; i <= m ; ++i){
        a[i] = read(), b[i] = read();
        road[i] = _dep[a[i]] + _dep[b[i]] - 2 * _dep[lca(a[i], b[i])];
        R = max(road[i], R);
    }
    r = R + 1;
    l = R - L;
    while(l < r){
        int mid = l + r >> 1;
        if(check(mid))r = mid;
        else l = mid + 1;
    }
    printf("%d\n", l);
	return 0;
}
2021/6/20 17:04
加载中...