真的球球了,悬赏2关,为什么官方数据8分实际0分,求求了
  • 板块学术版
  • 楼主2021sunzishan
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/12/6 20:09
  • 上次更新2024/12/6 21:43:51
查看原帖
真的球球了,悬赏2关,为什么官方数据8分实际0分,求求了
557270
2021sunzishan楼主2024/12/6 20:09

代码是这样

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
struct node{
	int next,to;
}edge[N*2];
int head[N],cnt=0;
void addedge(int u,int v){
	edge[++cnt].next=head[u];
	head[u]=cnt;
	edge[cnt].to=v;
}
int dep[N];
int f[N][50];
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		if(v==fa)continue;
		dfs(v,u);
	}
}
inline int read(){
	int a=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		a=a*10+c-'0';
		c=getchar();
	}
	return a*f;
}
int n,q;
int du[N];
int lca(int u,int v){
	if(dep[u]<=dep[v])swap(u,v);
	for(int i=20;i>=0;i--)
		if(dep[f[u][i]]>=dep[v])
			u=f[u][i];
	if(u==v)
		return u;
	for(int i=20;i>=0;i--)
		if(f[u][i]!=f[v][i])
			u=f[u][i],v=f[v][i];
	return f[u][0];
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		addedge(u,v),addedge(v,u);
	}
	dfs(1,0);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++)
			f[i][j]=f[f[i][j-1]][j-1];
	}
	q=read();
//	printf("%d\n",lca(3,5));
	while(q--){
		int l=read(),r=read(),k=read();
		int ans=0;
		for(int i=l;i<=r-k+1;i++){
			int q=i;
			for(int j=i+1;j<=i+k-1;j++)
				q=lca(q,j);
			ans=max(ans,dep[q]);
		}
		printf("%d\n",ans);
	}
	return 0;
}

球球了

2024/12/6 20:09
加载中...