WA on #13 求调(悬一关)
查看原帖
WA on #13 求调(悬一关)
935908
zengziqvan楼主2024/8/10 00:36

rt.

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
	ios::sync_with_stdio(false);
	cin.tie(0);
}
void Document() {
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
inline int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
	return s*w;
}
inline void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
void Tell() {
	//写数据结构注意初始化!
	//浮点数类题目过不了优先考虑精度!
	//vector动态开点注意内存重分配!
	//有本地写freopen!没本地别写!!!
	//最后几分钟给我老老实实坐那里,别手贱!!!
	//long long 级别的常数运算一定要用 xll!!!
	//一定要手玩几组极限数据,防止爆数。
	//大数据关同步流! 大数据关同步流! 大数据关同步流!
	//删调试!删调试!删调试!删调试!删调试!
	//注意数据类型!注意数据类型!注意数据类型!不要把存 int 的数组开成 char 类型!
	//注意数组大小的上界,不要把 5e6 打成 6e5!
}
const int N=5e5+10;
int dia[N],n,s,rt,tl,tot,hed[N],dis[N],nw,vis[N],dp[N][40],d[N],a[N],sl[N],sr[N];
struct edge {
	int nxt,to,val;
}e[N<<1];
void adde(int u,int v,int w) {
	e[++tot]={hed[u],v,w};
	hed[u]=tot;
}
void tr_dia(int x,int fa) {//找直径端点
	for(int i=hed[x];i;i=e[i].nxt) {
		int y=e[i].to,z=e[i].val;
		if(y==fa) continue;
		dis[y]=dis[x]+z;
		tr_dia(y,x);
	}
} 
bool find_dia(int x,int fa) {//找具体直径方案
	if(x==rt) {
		dia[++nw]=x;
		return 1;
	}
	for(int i=hed[x];i;i=e[i].nxt) {
		int y=e[i].to;
		if(y==fa) continue;
		if(find_dia(y,x)) {
			dia[++nw]=x;
			a[nw]=e[i].val;
			return 1;
		}
	}
	return 0;
}
void dfs(int x,int rt) {
	for(int i=hed[x];i;i=e[i].nxt) {
		int y=e[i].to;
		if(vis[y]) continue;
		vis[y]=1;
		dis[y]=dis[x]+e[i].val;
		d[rt]=max(d[rt],dis[y]);
		dfs(y,x);
	}
}
main() {
	cin>>n>>s;
	FOR(i,1,n-1) {
		int u=read(),v=read(),w=read();
		adde(u,v,w);
		adde(v,u,w);
	}
	FOR(i,1,n) dis[i]=1e18;dis[1]=0;
	tr_dia(1,0);FOR(i,1,n) if(dis[rt]<dis[i]) rt=i;
	FOR(i,1,n) dis[i]=1e18;dis[rt]=0;
	tr_dia(rt,0);FOR(i,1,n) if(dis[tl]<dis[i]) tl=i;
	find_dia(tl,0);
	FOR(i,1,nw) vis[dia[i]]=1;
	FOR(i,1,nw) dis[i]=1e18;
	FOR(i,1,nw) {
		dis[dia[i]]=0;
		dfs(dia[i],dia[i]);
	}
	int mx=0;
//	FOR(i,1,nw) cout<<dia[i]<<" ";puts("");
//	FOR(i,1,nw) cout<<a[i]<<" ";puts("");
	FOR(i,2,nw) sl[i-1]=sl[i-2]+a[i],cmax(mx,d[dia[i]]);
	ROF(i,nw,1) sr[i]=sr[i+1]+a[i];
	int ans=1e18,jl=0;
	for(int r=1,l=1;r<nw;++r) {
		while(jl>s&&l<r) {
			jl-=a[l];
			++l;
		}
		cout<<l<<" "<<r<<"\n";
		if(jl<=s) ans=min(ans,max(mx,max(sl[l-1],sr[r+1])));
		jl+=a[r];
	}
	cout<<ans<<"\n";
	return 0;
}
/*
5 2
1 2 5
2 3 2
2 4 4
2 5 3
*/
2024/8/10 00:36
加载中...