发现去年简直弱爆了,这么简单的一眼题都傻逼逼的不会做,NOIP快来了回去做一下这些简单题,然而边忘记开2倍N了然后70分无语了好久还以为是dfs栈爆了去写了bfs,算了算了
DFS:
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 200005
#define inf 10007
#define LL long long
using namespace std;
struct edge
{
int x,y,next;
}e[N*2];
LL w[N],sum[N],ls[N],cnt,faf[N],ma[N];
LL ans,anss;
int n;
void add(int x,int y)
{
int t=++cnt;e[t].x=x;e[t].y=y;e[t].next=ls[x];ls[x]=t;
t=++cnt;e[t].x=y;e[t].y=x;e[t].next=ls[y];ls[y]=t;
}
void dfs(int x,int pre,int prep)
{
if (prep>0) faf[x]=prep;
sum[pre]+=w[x];
if (!ma[pre]) ma[pre]=x;
if (w[x]>w[ma[pre]]) ma[pre]=x;
for (int i=ls[x];i!=0;i=e[i].next)
{
if (e[i].y!=pre) dfs(e[i].y,x,pre);
}
}
void work(int x,int pre)
{
// cout<<anss<<' '<<ans<<endl;
ans=(ans+w[faf[x]]*w[x]*2)%inf;
anss=max(anss,w[faf[x]]*w[x]);
ans=(ans+(sum[pre]-w[x])*w[x])%inf;
if (ma[pre]!=x) anss=max(anss,w[ma[pre]]*w[x]);
// cout<<anss<<' '<<ans<<endl;
for (int i=ls[x];i!=0;i=e[i].next)
{
if (e[i].y!=pre) work(e[i].y,x);
}
}
int main()
{
freopen("link.in","r",stdin);
freopen("link.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
dfs(1,0,-1);
work(1,0);
printf("%lld %lld\n",anss,ans);
return 0;
}
然后是BFS:
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 200005
#define inf 10007
#define LL long long
using namespace std;
struct edge
{
int x,y,next;
}e[N*2];
LL w[N],sum[N],ls[N],cnt,faf[N],ma[N];
LL ans,anss;
int n;
void add(LL x,LL y)
{
int t=++cnt;e[t].x=x;e[t].y=y;e[t].next=ls[x];ls[x]=t;
t=++cnt;e[t].x=y;e[t].y=x;e[t].next=ls[y];ls[y]=t;
}
int q[N],pre[N],prep[N],h,t,v[N];
void bfs()
{
h=0;t=1;q[t]=1;pre[t]=0;prep[t]=-1;memset(v,0,sizeof(v));v[1]=1;
while (h<t)
{
h++;
if (prep[h]>0) faf[q[h]]=prep[h];
sum[pre[h]]+=w[q[h]];
if (!ma[pre[h]]) ma[pre[h]]=q[h];
if (w[q[h]]>w[ma[pre[h]]]) ma[pre[h]]=q[h];
for (int i=ls[q[h]];i!=0;i=e[i].next)
{
if (!v[e[i].y])
{
q[++t]=e[i].y;
pre[t]=q[h];
prep[t]=pre[h];
v[e[i].y]=1;
}
}
}
}
void work()
{
h=0;t=1;q[t]=1;pre[t]=0;memset(v,0,sizeof(v));v[1]=1;
while (h<t)
{
h++;int x=q[h];
ans=(ans+(w[faf[x]]*w[x]%inf)*2)%inf;
anss=max(anss,w[faf[x]]*w[x]);
// cout<<anss<<' '<<ans<<' '<<x<<' '<<faf[x]<<' '<<pre[h]<<' '<<w[faf[x]]<<' '<<w[x]<<endl;
ans=(ans+(sum[pre[h]]-w[x])%inf*w[x])%inf;
if (ma[pre[h]]!=x) anss=max(anss,w[ma[pre[h]]]*w[x]);
// cout<<anss<<' '<<ans<<' '<<x<<' '<<faf[x]<<' '<<pre[h]<<' '<<ma[pre[h]]<<endl;
for (int i=ls[q[h]];i!=0;i=e[i].next)
{
if (!v[e[i].y])
{
q[++t]=e[i].y;
pre[t]=q[h];
v[e[i].y]=1;
}
}
}
}
int main()
{
freopen("link.in","r",stdin);
freopen("link.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<n;i++)
{
LL x,y;
scanf("%lld %lld",&x,&y);
add(x,y);
}
for (int i=1;i<=n;i++) scanf("%lld",&w[i]);
bfs();
work();
printf("%lld %lld\n",anss,ans);
return 0;
}