萌新求助 点分治
查看原帖
萌新求助 点分治
191281
Jr_Zlw楼主2021/8/11 23:46

思路同第一篇题解,用桶维护最小值

复杂度假了,TLE 95分

求助复杂度卡哪了

(不会是因为求重心用了2*dfs吧QAQ)

#include<bits/stdc++.h>
#define rep(a,b,c) for(register int c=(a);c<=(b);++c)
#define drep(a,b,c) for(register int c=(a);c>=(b);--c)
#define grep(a,b,c) for(register int c=a.head[(b)];c;c=a.nxt[c])
using namespace std;
inline int read()
{
	int res=0;char ch=getchar();bool flag=0;
	while(ch<'0'||ch>'9')flag^=(ch=='-'),ch=getchar();
	while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();
	return flag ? -res : res ;
}
const int N=2e5+10,M=4e5+10,V=1e7+10,INF=0x3f3f3f3f;
struct Gragh
{
	int head[N],des[M],nxt[M],val[M],cnt;
	inline void ins(int x,int y,int z){des[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;val[cnt]=z;}
	inline void Init(){memset(head,0,sizeof(head));cnt=1;}
}a;
int dep[N],dis[N],pre[N],siz,ans=INF,n,m,k,mn[V];bool vis[N];
int mx;inline void dfs0(int u,int &res,int fa=0)
{
	if((dep[u]=dep[fa]+1)>mx)mx=dep[u],res=u;pre[u]=fa;
	grep(a,u,i){int v=a.des[i];if(!vis[v]&&v^fa)dfs0(v,res,u);}
}
inline int fnd(int u)
{
	int S,T;mx=0;dep[u]=1;dfs0(u,S);dep[S]=1;mx=0;dfs0(S,T);
	int cur=T,Q=mx>>1;while(Q--)cur=pre[cur];return cur;
}
inline void dfs(int u,int Dis,int Dep=1,int fa=0)
{
	if(Dis>k)return;
	dis[++siz]=Dis;dep[siz]=Dep;grep(a,u,i)
	{
		int v=a.des[i];if(vis[v]||v==fa)continue;
		dfs(v,Dis+a.val[i],Dep+1,u);
	}
}
inline void Cnt(int u)
{
	vis[u]=1;siz=0;grep(a,u,i)
	{
		int v=a.des[i];if(vis[v])continue;
		int lst=siz;dfs(v,a.val[i]);
//		rep(lst+1,siz,j)printf("%d ",dis[j]);puts("");//printf("%d\n",ans);
		rep(lst+1,siz,j)ans=min(ans,mn[k-dis[j]]+dep[j]);
		rep(lst+1,siz,j)mn[dis[j]]=min(mn[dis[j]],dep[j]);
//		rep(lst+1,siz,j)printf("%d %d\n",dis[j],mn[dis[j]]);puts("\n");
	}//puts("");
	rep(1,siz,i)mn[dis[i]]=INF;
}
inline void Solve(int u)
{
	Cnt(u);grep(a,u,i){int v=a.des[i];if(!vis[v])Solve(fnd(v));}
}
int main()
{
//	freopen("qwq.txt","r",stdin);
	a.Init();n=read();k=read();memset(mn,0x3f,sizeof(mn));
	rep(2,n,i){int x=read()+1,y=read()+1,z=read();a.ins(x,y,z);a.ins(y,x,z);}
//	rep(1,n,i)grep(a,i,j)printf("%d %d %d\n",i,a.des[j],a.val[j]);
	Solve(fnd(1));printf("%d\n",ans>=n?-1:ans);
}
2021/8/11 23:46
加载中...