神秘做法求调
查看原帖
神秘做法求调
642144
This_Rrhar楼主2024/3/26 18:18

WA on #2,#5,#6,#7,80 pts80\,\rm pts

#include<bits/stdc++.h>
using namespace std;
#define _r return*this
#define _o &operator
namespace IO
{
	const int _S=1<<21;
	char b[_S],*p1=b,*p2=b,pb[_S],*pp=pb;
	void fl(){fwrite(pb,1,pp-pb,stdout),pp=pb;}
	struct input
	{
		char gc(){if(p1==p2)p2=(p1=b)+fread(b,1,_S,stdin);return p1==p2?' ':*p1++;}
		input _o>>(char&num){do num=gc();while(num==' '||num=='\n'||num=='\r'||num=='\t');_r;}
		template<typename T>input _o>>(T&x)
		{
			char c=gc();T f=1;
			for(x=0;!isdigit(c);)(c=='-'?f=-1:1),c=gc();
			while(isdigit(c))x=(x*10)+(c^48),c=gc();
			x*=f;_r;
		}
		input(){}
	}in;
	struct output
	{
		void pt(char num){*pp++=num;if(pp-pb==_S)fl();}
		output _o<<(char num){pt(num);_r;}
		template<typename T>output _o<<(T x)
		{
			if(!x){pt(48);_r;}
			if(x<0)pt('-'),x=-x;
			int s[64],t=0;
			while(x)s[++t]=x%10,x/=10;
			while(t)pt(s[t--]+48);
			_r;
		}
		output _o<<(const char*s){int num=0;while(s[num])pt(s[num++]);_r;}
		output(){}
	}out;
	struct fe{~fe(){fl();}}fls;
	
	int read(){int x;return in>>x,x;}
	long long readll(){long long x;return in>>x,x;}
}
using IO::in;
using IO::out;
using IO::read;
using IO::readll;
using ll=long long;
using pii=pair<ll,ll>;

#define N 200001

ll n;

ll q,ans=1e9;

vector<pii>e[N];

bool vis[N];

ll sz[N],mx[N],rt;
void getCent(ll u,ll f,ll s)
{
	sz[u]=1,mx[u]=0;
	for(pii i:e[u])if(i.first!=f&&!vis[i.first])
		getCent(i.first,u,s),sz[u]+=sz[i.first],mx[u]=max(mx[u],sz[i.first]);
	mx[u]=max(mx[u],s-sz[u]);
	if(!rt||mx[u]<mx[rt])rt=u;
}

ll a[N],cur;
ll d[N],b[N],dep[N];
void getDis(ll u,ll f,ll dis,ll t,ll rt)
{
	a[++cur]=u,d[u]=dis,dep[u]=t,b[u]=rt;
	for(pii i:e[u])if(i.first!=f&&!vis[i.first])getDis(i.first,u,dis+i.second,t+1,rt);
}
bool cmp(ll p,ll q)
{
	if(d[p]==d[q])return dep[p]<dep[q];
	return d[p]<d[q];
}
void calc(ll u)
{
	a[cur=1]=u,d[u]=0,b[u]=u;
	for(pii i:e[u])if(!vis[i.first])getDis(i.first,u,i.second,1,i.first);
	sort(a+1,a+1+cur,cmp);
	for(int l=1,r=cur;l<r;)
	{
		if(d[a[l]]+d[a[r]]>q)r--;
		else if(d[a[l]]+d[a[r]]<q)l++;
		else if(b[a[l]]==b[a[r]])
		{
			if(d[a[r]]==d[a[r-1]])r--;
			else l++;
		}
		else
		{
			ans=min(ans,dep[a[l]]+dep[a[r]]);
			break;
		}
	}
}
void slove(ll u)
{
	vis[u]=true,calc(u);
	for(pii i:e[u])if(!vis[i.first])rt=0,getCent(i.first,0,sz[i.first]),slove(rt);
}

ll x,y,z;

int main()
{
	in>>n>>q,mx[0]=n;
	for(int i=1;i<n;i++)in>>x>>y>>z,x++,y++,e[x].push_back({y,z}),e[y].push_back({x,z});
	getCent(1,0,n),slove(rt),out<<(ans==1e9?-1:ans);
}
2024/3/26 18:18
加载中...