考前变码风是不是很危
  • 板块灌水区
  • 楼主丹棘
  • 当前回复12
  • 已保存回复12
  • 发布时间2020/12/4 16:42
  • 上次更新2023/11/5 06:43:53
查看原帖
考前变码风是不是很危
321201
丹棘楼主2020/12/4 16:42

变成这样惹

#include <bits/stdc++.h>
using namespace std;

#define N 200005
#define R register
#define mod 10007

struct edge{
	int nx, to;
};

int n, Max, ans, w[N], g[N][2], f[N][2];//0 -> son ; 1 -> son's son
int len, head[N];
edge e[N*2];

inline void read(int &x){
	x = 0; bool f(0); char c = getchar();
	while( c < '0'||'9' < c ){if(c == '-') f = 1; c = getchar();}
	while('0' <= c&&c <= '9') x = (x << 1) + (x << 3) + c-'0', c = getchar();
	x= f ? -x : x;
}

inline void add(int u,int v){
	e[++len] = (edge){head[u], v};
	head[u] = len;
}

inline int ADD(int x,int y){return (1ll * x + y) % mod;}
inline int MUL(int x,int y){return 1ll * x * y % mod;}

void dfs(int x,int fa){
	for(R int i(head[x]) ; i ; i=e[i].nx){
		int y(e[i].to);
		if(y == fa) continue;
		dfs(y,x);
		ans = ADD(ans, MUL(g[x][0], w[y]));
		Max = max(Max, f[x][0] * w[y]);
		f[x][0] = max(f[x][0], w[y]);
		f[x][1] = max(f[x][1], f[y][0]);
		g[x][0] = ADD(g[x][0], w[y]);
		g[x][1] = ADD(g[x][1], g[y][0]);
	}
	ans = ADD(ans, MUL(g[x][1], w[x]));
	Max = max(Max, f[x][1] * w[x]);
}

int main(){
	read(n);
	for(R int i(1) ; i < n ; ++i){
		int u,v;
		read(u), read(v);
		add(u,v), add(v,u);
	}
	for(R int i(1) ; i <= n ; ++i) read(w[i]);
	dfs(1,0);
	printf("%d %d\n", Max, MUL(ans, 2));
	return 0;
}
2020/12/4 16:42
加载中...