比赛 不平凡的世界 评测结果 C
题目名称 不平凡的许愿树 最终得分 0
用户昵称 YXH_YXH 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2015-11-05 11:45:02
显示代码纯文本
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAXN=5010,oo=200000000;
int N;//点数
struct edge{
	int y,next;
}e[MAXN];
int link[MAXN],len;//链表
int que[MAXN],ceng[MAXN];
bool f[MAXN]={};//队列
int Maxh=-oo;
int sum1=0;
long long sum2=0;
int x,y;//temp
inline void insert(int x,int y){
	e[++len].next=link[x],link[x]=len;
	e[len].y=y;
}
void init(){
	cin>>N;
	for(int i=1; i<N; i++){
		scanf("%d%d",&x,&y);
		insert(x,y),insert(y,x);
	}
}
void yu(){
	memset(ceng,10,sizeof(ceng));
	int head=0,tail=0;
	que[++tail]=1,f[1]=1,ceng[1]=0;
	while(++head<=tail){
		int now=que[head],nex;
		for(int i=link[now]; i; i=e[i].next){
			nex=e[i].y;
			if(!f[nex])//进队
				que[++tail]=nex,ceng[nex]=ceng[now]+1,f[nex]=1;
		}
		if(ceng[now]>Maxh)Maxh=ceng[now];
	}
	//for(int i=1; i<=N; i++)cout<<ceng[i]<<endl;
}
void work(){
	sort(ceng+1,ceng+N+1);
	//for(int i=1; i<=N; i++)cout<<ceng[i]<<endl;
	for(int i=1; i<Maxh; i++){//哪里 作为中间点
		int top1=1,top2=1,top3=1;
		while(ceng[top1]<i)top1++;
		for(int j=1; 0<=i-j&&i+j<=Maxh; j++){
			long long tsum=0;
			top2=top1,top3=top1;
			while(ceng[top3]<=i)top3++;
			while(ceng[top2]>i-j)top2--,tsum++;//偏移?
			while(ceng[top3]<=i+j)top3++,tsum++;
			if(tsum>=3){
				tsum=tsum*(tsum-1)*(tsum-2)/6;
				sum1+=tsum%338,sum1%=338;
				sum2+=tsum;
			}
		}
	}
}
int main(){
	freopen("hopetree.in","r",stdin);
	freopen("hopetree.out","w",stdout);
	
	init();
	yu();
	work();
	cout<<sum1+1<<' ';
	sum2=(sum2+233)%338+1;
	cout<<sum2<<endl;
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
/*

*/