社区讨论

TLE on #13,求卡常

P2680[NOIP 2015 提高组] 运输计划参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lzu0ipnh
此快照首次捕获于
2024/08/14 23:34
2 年前
此快照最后确认于
2024/08/15 09:49
2 年前
查看原帖
CPP
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const long long Max=3e5+1;
long long ans=0,hole=0;
long long n,m;
long long fa[20][Max],tot,Head[Max],Next[2*Max],ver[2*Max],edge[2*Max],cnt[Max],dep[Max],path[Max],sum1[Max];
long long LCA[Max];
pair<long long,long long> line[Max];
long long lca(long long x,long long y){
	if(dep[x]<dep[y]){
		swap(x,y);
	}
	long long c=dep[x]-dep[y];
	for(long long i=19;i>=0;i--){
		if(c&(1<<i)){
			x=fa[i][x];
		}
	}
//	cout<<dep[x]<<" "<<dep[y]<<endl;
	if(x==y){
		return x;
	}
	for(long long i=19;i>=0;i--){
		if(fa[i][x]!=fa[i][y]){
			x=fa[i][x];
			y=fa[i][y];
		}
	}
	return fa[0][x];
}
void add(long long x,long long y,long long z){
	ver[++tot]=y;edge[tot]=z;
	Next[tot]=Head[x];Head[x]=tot;
}
void dfs1(long long x,long long f,long long d){
//	cout<<"dfs"<<x<<" "<<d<<endl;
	fa[0][x]=f;dep[x]=d;
	for(long long i=1;i<=19;i++){
		fa[i][x]=fa[i-1][fa[i-1][x]];
	}
	for(long long i=Head[x];i;i=Next[i]){
		long long y=ver[i];
		if(y==f){
			continue;
		}
		sum1[y]=sum1[x]+edge[i];
		dfs1(y,x,d+1);
	//	cout<<"sum"<<y<<" "<<x<<" "<<sum1[x]<<" "<<sum1[y]<<endl;
	}
}
bool flag=0;
long long me=0;
long long dfs2(long long x,long long f,long long z){
	long long sum=0;
	for(long long i=Head[x];i;i=Next[i]){
		long long y=ver[i];
		if(y==f){
			continue;
		}
		long long z1=dfs2(y,x,z),w=edge[i];
		if(z1==z){
			flag=1;
			me=max(me,w);
		}
		sum+=z1;
	}		
	sum+=cnt[x];
	return sum;
}
bool check(long long x){
	long long mp=0;
	flag=0;me=0;
	long long num=0;
	memset(cnt,0,sizeof(cnt));
	for(long long i=1;i<=m;i++){
		if(path[i]>x){
			num++;
			long long a=line[i].first,b=line[i].second;
			cnt[a]++;cnt[b]++;cnt[LCA[i]]-=2;
		//	cout<<"check"<<a<<" "<<b<<endl;
			mp=max(path[i],mp);
		}
	}

	dfs2(1,0,num);	
//	cout<<mp<<" "<<me<<" "<<x<<endl;
	if(flag&&mp-me<=x){
		return 1;
	}
	return 0;
}
signed main(){
    ios::sync_with_stdio(0);
	cin>>n>>m;
	long long mp=0;
	for(long long i=1;i<=n-1;i++){
		long long x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	dfs1(1,0,1);
	for(long long i=1;i<=m;i++){
		long long x,y;
		cin>>x>>y;
		line[i]=make_pair(x,y);
		long long z=lca(x,y);LCA[i]=z;
	//	cout<<z<<endl;
		path[i]=sum1[x]+sum1[y]-2*sum1[z];
	//	cout<<sum1[x]<<" "<<sum1[y]<<endl;
		mp=max(mp,path[i]);
	//	cout<<"p"<<" "<<path[i]<<" "<<x<<" "<<y<<" "<<z<<endl;
	}
	long long l=0,r=mp;
	while(l<r){
		long long mid=(l+r)>>1;
		if(check(mid)){
			r=mid;
		}else{
			l=mid+1;
		}
	}
	cout<<l;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...