#13 TLE 请求卡常
查看原帖
#13 TLE 请求卡常
515129
TLEWA楼主2023/11/20 12:44

只能改成链式前向星解决吗

#include<bits/stdc++.h>
#define v__ v_w.first
#define w__ v_w.second
#define int unsigned int

using namespace std;

const int N=300005;

int n,m;
vector<pair<int,int> > vec[N];

struct Test{
	int u,v,cost,lca;
}tests[N];

bool cmp(Test t1,Test t2) {return t1.cost>t2.cost;}

int cost[N],fa[N],siz[N],dep[N],mson[N],top[N],dfn[N];

void dfs1(int u,int father,int now_cost) {
	siz[u]=1,fa[u]=father,dep[u]=dep[father]+1,cost[u]=now_cost;
	
	for(auto v_w:vec[u]) {
		if(v__==father) continue;
		dfs1(v__,u,now_cost+w__);
		siz[u]+=siz[v__];
		if(siz[v__]>siz[mson[u]]) mson[u]=v__;
	}
}

int cnt;
void dfs2(int u,int top_node) {
	if(u==0) return;
	top[u]=top_node,dfn[u]=++cnt;
	
	dfs2(mson[u],top_node);
	
	for(auto v_w:vec[u]) {
		if(v__==fa[u] || v__==mson[u]) continue;
		dfs2(v__,v__);
	}
}

int get_lca(int u,int v) {
	while(top[u]!=top[v]) {
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	return u;
}

int val[N],delta,maxval;

void dfs3(int u) {
	for(auto v_w:vec[u]) {
		if(v__==fa[u]) continue;
		dfs3(v__);
		val[u]+=val[v__];
	}
}

void dfs4(int u) {
	for(auto v_w:vec[u]) {
		if(v__==fa[u]) {
			if(val[u]==maxval&&val[v__]==maxval) {
				delta=max(delta,w__);
			}
			continue;
		}
		dfs4(v__);
	}
}

bool check(int want) {
	memset(val,0,sizeof(val));
	maxval=0;
	for(int i=1;i<=m;++i) {
		if(tests[i].cost>want) {
			val[tests[i].u]++,val[tests[i].v]++;
			val[tests[i].lca]--,val[fa[tests[i].lca]]--;
			maxval++;
		}
	}
	delta=0;
	dfs3(1); //差分
	dfs4(1); //获取最大边
	
	if(tests[1].cost-delta<=want) return 1;
	return 0; 
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	cin >> n >> m;
	
	int u,v,w;
	for(int i=1;i<n;++i) {
		cin >> u >> v >> w;
		vec[u].push_back(make_pair(v,w));
		vec[v].push_back(make_pair(u,w));
	}
	
	dfs1(1,0,0);
	dfs2(1,1);
	
	for(int i=1;i<=m;++i) {
		cin >> u >> v;
		tests[i].u=u,tests[i].v=v,tests[i].lca=get_lca(u,v);
		tests[i].cost=cost[u]+cost[v]-2*cost[tests[i].lca];
	}
	
	sort(tests+1,tests+1+m,cmp);
	
	int l=0,r=tests[1].cost+10,mid,ans=0;
	while(l<=r) {
		mid=(l+r)>>1;
		if(check(mid)) r=mid-1,ans=mid;
		else l=mid+1;
	}
	
	cout << ans;
	
	return 0;
}

2023/11/20 12:44
加载中...