一个疑惑?
查看原帖
一个疑惑?
194761
Isenthalpic楼主2021/2/6 10:15

很奇怪,校内oj过了,本地过了luogu的第一个数据,时限在范围内,为什么luogu上全T了

#include<bits/stdc++.h>
#define inf (1<<30) 
using namespace std;
const int N=4e5+10,MX=1e6; 
int n,k,cnt,rt,ns;
int pre[N],now[N],to[N],val[N],tot;
int me[N],siz[N];
int ans=1e9;
int t[MX+10],BT[MX+10];
int b[N],nc,BS[N];
bool vis[N];
vector<int>fk;
int read(){
	int a=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){a=(a<<1)+(a<<3)+c-'0';c=getchar();}
	return a;
}
void add(int x,int y,int z){
	pre[++tot]=now[x];
	now[x]=tot;to[tot]=y;
	val[tot]=z;
}
void findrt(int u,int F){
	me[u]=0;siz[u]=1;
	for(int i=now[u];i;i=pre[i]){
		int v=to[i];
		if(v==F||vis[v])continue;
		findrt(v,u);
		siz[u]+=siz[v];
		me[u]=max(me[u],siz[v]);
	}
	me[u]=max(me[u],ns-siz[u]);
	if(me[u]<me[rt])rt=u;
}
int pre_dfs(int u,int F,int D,int NUM){
	b[++nc]=D;BS[nc]=NUM;
	for(int i=now[u];i;i=pre[i]){
		int v=to[i],z=val[i];
		if(vis[v]||v==F)continue;
		pre_dfs(v,u,D+z,NUM+1);
	}
}
void DFS(int u,int F,int D,int NUM){
	if(D<=MX){
		t[D]++;
		BT[D]=min(BT[D],NUM);
		if(t[D]==1)fk.push_back(D);
	}
	for(int i=now[u];i;i=pre[i]){
		int v=to[i],z=val[i];
		if(vis[v]||v==F)continue;
		DFS(v,u,D+z,NUM+1);
	}
}
void solve(int u){
	for(int i=0;i<fk.size();i++)
		BT[fk[i]]=inf,t[fk[i]]=0;
	t[0]++;BT[0]=0;
	fk.clear();
	for(int i=now[u];i;i=pre[i]){
		int v=to[i],z=val[i];
		if(vis[v])continue;
		nc=0;
		pre_dfs(v,u,z,1);
		for(int j=1;j<=nc;j++){
			int tmp=k-b[j];
			if(tmp<0||tmp>MX)continue;
			if(t[tmp])ans=min(ans,BS[j]+BT[tmp]);
		}
		DFS(v,u,z,1);
	}
}
void dfs(int u){
	solve(u);
	vis[u]=true;
	for(int i=now[u];i;i=pre[i]){
		int v=to[i];
		if(vis[v])continue;
		ns=siz[v];rt=0;
		findrt(v,u);
		dfs(rt);
	}
}
int main(){
	memset(BT,0x3f,sizeof(BT));
	n=read();k=read();
	for(int i=1;i<n;i++){
		int u,v,l;
		u=read();v=read();l=read();
		u+=1;v+=1;
		add(u,v,l);add(v,u,l);
	}
	me[0]=inf;rt=0;ns=n;
	findrt(1,0);
	dfs(rt);
	if(ans!=1e9)printf("%d",ans);
	else puts("-1");
	return 0;
}
2021/2/6 10:15
加载中...