比赛 |
不平凡的世界 |
评测结果 |
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;
}
/*
*/