zoukankan      html  css  js  c++  java
  • Codeforces Round #660 (Div. 2)

    AB

    签到

    C

    计算子树内的人总数,然后可以计算出经过此节点时开心的人数目,然后若存在节点开心人数目小于儿子之和,则输出NO,反之输出YES,注意特判特殊情况

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=1e5+7;
    int T,n,a[N],h[N];
    bool yes;
    vector<int>G[N];
    void dfs(int u,int f)
    {
        for(int i=0;i<G[u].size();i++)
        if(G[u][i]!=f)dfs(G[u][i],u),a[u]+=a[G[u][i]];
    }
    void dfs2(int u,int f)
    {
        int sum=0;
        for(int i=0;i<G[u].size();i++)
        if(G[u][i]!=f)dfs2(G[u][i],u),sum+=h[G[u][i]];
        if(sum>h[u])yes=0;
    }
    signed main()
    {
        scanf("%lld",&T);
        while(T--)
        {
            scanf("%lld%*d",&n);
            for(int i=1;i<=n;i++)G[i].clear();
            for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
            for(int i=1;i<=n;i++)scanf("%lld",&h[i]);
            for(int i=1,x,y;i<n;i++)scanf("%lld%lld",&x,&y),G[x].push_back(y),G[y].push_back(x);
            dfs(1,0);
            yes=1;
            for(int i=1;i<=n;i++)
            if((h[i]%2+2)%2!=a[i]%2||h[i]>a[i]||h[i]<-a[i]){yes=0;break;}
            else h[i]=a[i]-(a[i]-h[i])/2;
            if(!yes){puts("NO");continue;}
            dfs2(1,0);
            if(yes)puts("YES");else puts("NO");
        }
    }
    View Code

    D

    反向连边,然后构成一个森林,扫一遍即可,判断若儿子总和大于0则先加,反之最后一块加,注意后加从上往下扫

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+7;
    typedef long long ll;
    int n,cnt,p[N],vis[N],isrt[N];
    ll ans,a[N];
    vector<int>G[N];
    void dfs(int u)
    {
        if(!G[u].size())return;
        for(int i=0;i<G[u].size();i++)dfs(G[u][i]);
        for(int i=0;i<G[u].size();i++)
        if(a[G[u][i]]>0)vis[G[u][i]]=1,p[++cnt]=G[u][i],a[u]+=a[G[u][i]],ans+=a[G[u][i]];
    }
    void check(int u)
    {
        if(!vis[u])p[++cnt]=u,ans+=a[u];
        for(int i=0;i<G[u].size();i++)check(G[u][i]);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        for(int i=1,x;i<=n;i++)
        {
            scanf("%d",&x);
            if(x!=-1)G[x].push_back(i);
            else isrt[i]=1;
        }
        for(int i=1;i<=n;i++)if(isrt[i])dfs(i);
        for(int i=1;i<=n;i++)if(isrt[i])check(i);
        printf("%lld
    ",ans);
        for(int i=1;i<=n;i++)printf("%d ",p[i]);
    }
    View Code

    用退役前开的号KD-Tree打的。真实手速场。

    rank4 rating+=329 nowrating=2083(艹差一点就上橙了,早知道用新号直接上橙了)

  • 相关阅读:
    poj 图算法
    类里二级排序函数使用
    数学题目(高斯消元)
    多校联合比赛部分题目
    poj 3007 & poj 3096
    优先队列
    hdu 各种 A + B
    几道数学题目
    今天下午
    Java常用的几种设计模式
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/13409353.html
Copyright © 2011-2022 走看看