zoukankan      html  css  js  c++  java
  • BZOJ 3727 Final Zadanie

    递推一下什么的就好了。。。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxv 300050
    #define maxe 600050
    using namespace std;
    long long n,x,y,g[maxv],nume=1,tot1=0,tot2=0,dis[maxv],b[maxv],sum[maxv];
    long long fath[maxv];
    struct edge
    {
        long long v,nxt;
    }e[maxe];
    void addedge(long long u,long long v)
    {
        e[++nume].v=v;e[nume].nxt=g[u];
        g[u]=nume;
    }
    long long read()
    {
        char ch;long long data=0;
        while (ch<'0' || ch>'9') ch=getchar();
        while (ch>='0' && ch<='9')
        {
            data=data*10+ch-'0';
            ch=getchar();
        }
        return data;
    }
    void dfs1(long long x)
    {
        if (x-1) tot2+=(b[fath[x]]-b[x]);
        for (long long i=g[x];i;i=e[i].nxt)
        {
            long long v=e[i].v;
            if (v!=fath[x])
            {
                fath[v]=x;dis[v]=dis[x]+1;
                dfs1(v);
            }
        }
    }
    void dfs2(long long x)
    {
        for (long long i=g[x];i;i=e[i].nxt)
        {
            long long v=e[i].v;
            if (v!=fath[x]) {sum[x]-=sum[v];dfs2(v);}
        }
    }
    int main()
    {
        n=read();
        for (long long i=1;i<=n-1;i++)
        {
            x=read();y=read();
            addedge(x,y);addedge(y,x);
        }
        for (int i=1;i<=n;i++) scanf("%lld",&b[i]);
        dfs1(1);
        sum[1]=(2*b[1]-tot2)/(n-1);for (long long i=2;i<=n;i++) sum[i]=(sum[1]+b[fath[i]]-b[i])/2;
        dfs2(1);
        for (long long i=1;i<=n-1;i++) printf("%lld ",sum[i]);
        printf("%lld
    ",sum[n]);
        return 0;
    }
  • 相关阅读:
    20210309-2 阅读任务
    20210309-1 准备工作
    课程总结
    第十四周课程总结&实验报告(简单记事本的实现)
    十三周课程总结
    十二周课程总结
    第十一周课程总结
    C语言ll作业01
    C语言寒假大作战04
    C语言寒假大作战03
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/6567538.html
Copyright © 2011-2022 走看看