zoukankan      html  css  js  c++  java
  • CF1153D Serval and Rooted Tree

    题目链接:戳我

    因为树形结构,我们考虑树形DP。

    求的是根节点最大的是多少,那么我们可以设(dp[i])表示在以i为根的子树中,i占第K大。

    如果该节点取min,那么就是自己子节点的(sum),因为它要取最小的,所以K取最大。

    如果该节点取max,那么就是自己节点的(min),因为K越小,值越大。

    代码如下:(话说这不是O(n)的时间复杂度吗。。。)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define MAXN 300010
    using namespace std;
    int n,t,sum;
    int dp[MAXN],fa[MAXN],op[MAXN],head[MAXN<<1];
    struct Edge{int nxt,to;}edge[MAXN<<1];
    inline void add(int from,int to){edge[++t].nxt=head[from],edge[t].to=to,head[from]=t;}
    inline void dfs(int x,int pre)
    {
        bool flag=false;
        for(int i=head[x];i;i=edge[i].nxt)
        {
            flag=true;
            int v=edge[i].to;
            dfs(v,x);
            if(op[x]==0) dp[x]+=dp[v];
            else dp[x]=min(dp[x],dp[v]);
        }
        if(flag==false) dp[x]=1,sum++;
        // printf("dp[%d]=%d
    ",x,dp[x]);
        return;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d",&n);
        for(int i=1;i<=n;i++) 
        {
            scanf("%d",&op[i]);
            if(op[i]==0) dp[i]=0;
            else dp[i]=n+1;
        }
        for(int i=2;i<=n;i++) scanf("%d",&fa[i]),add(fa[i],i);
        dfs(1,0);
        printf("%d
    ",sum-dp[1]+1);
        return 0;
    }
    
  • 相关阅读:
    理解 Redis(3)
    理解 Redis(2)
    理解 Redis(1)
    git 的基本命令
    使用python实现计算器功能
    python函数说明内容格式错误
    python的小基础
    python去除读取文件中多余的空行
    数论-下属不可以和上司顶嘴!(可能是总结)
    其他-一大堆记录 (20 Dec
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10743813.html
Copyright © 2011-2022 走看看