75 pts 求调 4 WA,1 TLE
查看原帖
75 pts 求调 4 WA,1 TLE
543555
_Emperorpenguin_楼主2024/10/24 21:42

rt,提交记录

#include <bits/stdc++.h>
#pragma GCC optmize(2)
#define debug puts("done")
using namespace std;

#define int long long
int n,m,u,v,W;
int lg[300005]={-1},d[300005],f[300005][30],s[300005],ans,sum[300005];
vector<int> e[300005],w[300005];
struct Node{
	int u,v,x;
}t[300005];

void dfs(int u,int fa){
	d[u]=d[fa]+1;
	f[u][0]=fa;
	for(int i=1;i<=lg[d[u]];i++)
		f[u][i]=f[f[u][i-1]][i-1];
	for(int i=0;i<e[u].size();i++)
		if(e[u][i]!=fa){
			sum[e[u][i]]+=sum[u]+w[u][i];
			dfs(e[u][i],u);
		}
	return;
}

int LCA(int x,int y){
	while(d[x]>d[y]) x=f[x][lg[d[x]-d[y]]];
//	cout<<x<<" "<<y<<endl;
	if(x==y) return x;
	for(int i=lg[d[x]];i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}

void dfs2(int u,int fa){
	for(int i=0;i<e[u].size();i++)
		if(e[u][i]!=fa){
			dfs2(e[u][i],u);
			s[u]+=s[e[u][i]];
		}
//	cout<<u<<" "<<s[u]<<endl;
	return;
}

bool cmp(Node a,Node b){
	return a.x>b.x;
}

signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin>>n>>m;
	for(int i=1;i<n;i++){
		cin>>u>>v>>W;
		e[u].push_back(v);
		e[v].push_back(u);
		w[u].push_back(W);
		w[v].push_back(W);
	}
	for(int i=1;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	dfs(1,0);
	for(int i=1;i<=m;i++){
		cin>>t[i].u>>t[i].v;
		u=t[i].u,v=t[i].v;
//		cout<<d[u]<<" "<<d[v]<<endl<<endl;;
//		cout<<endl;
		if(d[u]<d[v]) swap(u,v);
		int p=LCA(u,v);
//		s[p]-=2;
//		s[u]++,s[v]++;
		t[i].x=sum[u]+sum[v]-2*sum[p];
//		cout<<t[m].x<<endl;
//		cout<<endl;
	}
//	dfs2(1,0);
	sort(t+1,t+m+1,cmp);
	ans=t[1].x;
	for(int i=1;i<=n;i++)
		for(int j=0;j<e[i].size();j++){
			int res=0;
			for(int k=1;k<=m;k++){
				if(res>=t[k].x||res>=ans) break;
//				cout<<k<<" "<<t[k].x<<" "<<t[k].u<<" "<<t[k].v<<" "<<e[i][j]<<endl;
				int o=LCA(t[k].u,t[k].v),p=LCA(t[k].u,e[i][j]),q=LCA(t[k].v,e[i][j]);
//				cout<<o<<" "<<p<<" "<<q<<endl;
				if(((o==p)&&(e[i][j]==q))||((o==q)&&(e[i][j]==p))) res=max(res,t[k].x-w[i][j]);
				else{
					res=max(res,t[k].x);
					break;
				}
			}
			ans=min(ans,res);
		}	
	cout<<ans;
	return 0;
}
2024/10/24 21:42
加载中...