1 solutions

  • 0
    @ 2025-11-5 16:55:11

    C++ :

    #include <cstdio>
    
    #define  maxn  200005LL
    #define  maxe  400010LL
    #define  ansmod 10007LL
    
    //typedef long long ll ;
    
    int n ;
    
    struct FST{
    	int to , next ;
    } e[maxe] ; int tot = 0 , star[maxn] = {0} ;
    
    void AddEdge(int u , int v) {
    	tot ++ ; e[tot].to = v ;
    	e[tot].next = star[u] ; star[u] = tot ;
    }
    
    int ans = 0 ;
    int ans2 = 0 ;
    int val[maxn] = {0} ;/*每个节点原权值*/
    int sum[maxn] = {0} ;/*每个节点的儿子节点权值和*/
    int maxx[maxn] = {0} ;/*每个节点中第一大儿子节点权值*/
    
    void dfs(int now , int fa) {
    	int next , p ;
    	for (p=star[now] , next=e[p].to ; p ; p=e[p].next , next=e[p].to) {
    		if (next == fa) continue ;
    		ans += (val[next]*sum[now])%ansmod ; ans %= ansmod ;
    		sum[now] += val[next] ; sum[now] %= ansmod ;
    		if (val[next]*maxx[now] > ans2) ans2 = val[next]*maxx[now] ;
    		if (val[next] > maxx[now]) maxx[now] = val[next] ;
    		dfs(next , now) ;
    		ans += (val[now]*sum[next])%ansmod ; ans %= ansmod ;
    		if (val[now]*maxx[next] > ans2) ans2 = val[now]*maxx[next] ;
    	}
    }
    
    int main() {
    //	    freopen("link.in" ,"r",stdin ) ;
    //	    freopen("link.out","w",stdout) ;
    	int i , u , v ;
    	scanf("%d", &n ) ;
    	for (i = 1 ; i < n ; i ++ ) {
    		scanf("%d%d", &u , &v ) ;
    		AddEdge(u , v) ;
    		AddEdge(v , u) ;
    	}
    	for (i = 1 ; i <= n ; i ++ ) {
    		scanf("%d", &val[i] ) ;
    	}
    	dfs(1,0) ;
    	printf("%d %d\n", ans2 , (ans*2)%ansmod ) ;
    	    fclose(stdin ) ; fclose(stdout) ;
    	return 0 ;
    }
    
    • 1

    Information

    ID
    18073
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By