题解 CF500D 【New Year Santa Network】

简介: 题目链接 这道题首先是要看看该如何化简,先把三元组化成二元组。之后统计经过某条边的 次数$*$权值  的和。最后除以总基数 $tot$其中,每条边被计算的次数为 子树的点数$*$非子树的点数 (自己想想)然后就没了。

题目链接

这道题首先是要看看该如何化简,先把三元组化成二元组。

之后统计经过某条边的 次数$*$权值  的和。

最后除以总基数 $tot$


其中,每条边被计算的次数为 子树的点数$*$非子树的点数 (自己想想)

然后就没了。

 ps:一定要注意$n$个节点的树有$n-1$条边,本宝宝调了一下午+一晚上。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct data{int v;int value;int nxt;}edge[200010];
int alist[100010];int cnt;
void add(int u,int v,int value)
{
    edge[++cnt].nxt=alist[u];
    edge[cnt].v=v;
    edge[cnt].value=value;
    alist[u]=cnt;
}

int len[100010];
int num[100010];
int n,m;
int in[100010];int out[100010];

double ans;double tot;
void dfs(int x,int f)
{
    num[x]=1;
    for(int i=alist[x];i!=-1;i=edge[i].nxt)
    {
        int v=edge[i].v;
        if(v==f) continue;
        dfs(v,x);
        num[x]+=num[v];
        ans+=(double)edge[i].value*num[v]*(n-num[v])/tot;
    }
}

int u,v,value;
int main()
{
    scanf("%d",&n);
    memset(alist,-1,sizeof(alist));
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&u,&v,&value);
        in[i]=u;
        out[i]=v;
        len[i]=value;
        add(u,v,value);
        add(v,u,value);
    }
    tot=(double)n*(n-1)/6.0;
    dfs(1,-1);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        value=min(num[in[u]],num[out[u]]);
        ans-=(double)(len[u]-v)*value*(n-value)/tot;
        len[u]=v;
        printf("%.8lf\n",ans);
    }
    return 0;
}

 

相关文章
LeetCode 202. Happy Number
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
112 0
LeetCode 202. Happy Number
|
算法
LeetCode 306. Additive Number
累加数是一个字符串,组成它的数字可以形成累加序列。 一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。 给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。 说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
123 0
LeetCode 306. Additive Number
LeetCode 67. Add Binary
给定两个二进制字符串,返回它们的总和(也是二进制字符串)。 输入字符串都是非空的,只包含字符1或0。
75 0
LeetCode 67. Add Binary
|
机器学习/深度学习
LeetCode之Happy Number
LeetCode之Happy Number
145 0
LeetCode之Number Complement
LeetCode之Number Complement
70 0
|
机器学习/深度学习
|
机器学习/深度学习
[LeetCode]--202. Happy Number
Write an algorithm to determine if a number is “happy”. A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of th
1248 0