求助 TLE#13 95pts
查看原帖
求助 TLE#13 95pts
450237
Calvin0221楼主2022/7/23 08:56
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 1;
const int maxm = maxn * 2;
int n,m,x,y,z,num,tmp,tot1,tot2,res,maxx;
int head[maxn],edge[maxm],nxt[maxm],w[maxn];
int headq[maxn],edgeq[maxm],nxtq[maxm],wq[maxm];
int siz[maxn],dis[maxn],fa[maxn],len[maxn];
bool st[maxn];
struct node{
	int u,v;
	int lca,len;
}g[maxn];
static inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
static inline void add(int x,int y,int z){
	edge[++tot1] = y;
	w[tot1] = z;
	nxt[tot1] = head[x];
	head[x] = tot1;
}
static inline void add_que(int x,int y){
	edgeq[++tot2] = y;
	nxtq[tot2] = headq[x];
	headq[x] = tot2;
}
static inline int find(int x){
	if(fa[x] == x) return x;
	else return fa[x] = find(fa[x]);
}
static inline void join(int x,int y){
	int p1 = find(x);
	int p2 = find(y);
	if(p1 != p2) fa[p1] = find(p2);
}
static inline void dfs(int now,int father){
	for(register int i=head[now];i;i=nxt[i]){
		int j = edge[i];
		if(j == father) continue;
		dfs(j,now);
		siz[now] += siz[j];
	}
	if(siz[now] == num && len[now] > tmp) tmp = len[now];
}
static inline bool check(int x){
	memset(siz,0,sizeof(siz));
	num = tmp = 0;
	for(register int i=1;i<=m;i++){
		if(g[i].len > x){
			siz[g[i].u]++,siz[g[i].v]++;
			siz[g[i].lca] -= 2;
			num++;
		}
	}
	dfs(1,0);
	return (maxx - tmp <= x);
}
static inline void tarjan(int now,int father){
	for(register int i=head[now];i;i=nxt[i]){
		int j = edge[i];
		if(j == father) continue;
		dis[j] = dis[now] + w[i];
		tarjan(j,now);
		len[j] = w[i];
		join(j,now);
		st[j] = true;
	}
	for(register int i=headq[now];i;i=nxtq[i]){
		int j = edgeq[i];
		if(!st[j]) continue;
		int t = (i + 1) / 2;
		g[t].lca = find(j);
		g[t].len = dis[now] + dis[j] - 2 * dis[g[t].lca];
		maxx = max(maxx,g[t].len);
	}
}
static inline void binary_search(){
	int left = 0;
	int right = maxx;
	while(left <= right){
		int mid = (left + right) / 2;
		if(check(mid)) right = mid - 1,res = mid;
		else left = mid + 1;
	}
} 
int main(){
	n = read(),m = read();
	for(register int i=1;i<=n;i++) fa[i] = i;
	for(register int i=1;i<n;i++){
		x = read(),y = read(),z = read();
		add(x,y,z),add(y,x,z);
	}
	for(register int i=1;i<=m;i++){
		x = read(),y = read();
		g[i].u = x,g[i].v = y;
		add_que(x,y),add_que(y,x);
	}
	tarjan(1,0);
	binary_search();
	printf("%d\n",res);
	return 0;
}
2022/7/23 08:56
加载中...