• P2279 [HNOI2003]消防局的设立


    之前拿dp写过一次。炸了。但就一直烂在哪里了。

    昨天同学胡策。出到了一部分。说使用贪心做。时间复杂度是(O(nk))的。其中k是半径。

    然后就学习了一波。

    当然这道题是只考虑点支配(差不多)

    感觉这个贪心很妙

    大体就是按照深度,处理出多少级祖先来,然后贪心。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    using std::sort;
    using std::min;
    const int maxn=101000;
    int f[maxn],d[maxn],dis[maxn];
    int tmp[maxn];
    bool compare(int a,int b)
    {
        return d[a]>d[b];
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        dis[0]=dis[1]=n;
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&f[i]);
            dis[i]=n;
            d[i]=d[f[i]]+1;
        }
        for(int i=1;i<=n;i++)   tmp[i]=i;
        sort(tmp+1,tmp+n+1,compare);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            int pas=tmp[i];
            int F1=f[pas];
            int F2=f[F1];
            dis[pas]=min(dis[pas],min(dis[F1]+1,dis[F2]+2));
            if(dis[pas]>2)
            {
                ans++;
                dis[F2]=0;
                dis[f[F2]]=min(dis[f[F2]],1);
                dis[f[f[F2]]]=min(dis[f[f[F2]]],2);
            }
        }
        printf("%d",ans);
    }
    
    
  • 相关阅读:
    6_java_maven
    线性代数 linear algebra
    hadoop_wordcount_1027
    hadoop_worddistinct_1030
    hadoop_wordcount_1023
    搭建伪分布式_笔记
    linux-sunrpc
    linux-volatile
    linux---asmlinkage
    dqs_linux-1
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9895092.html
Copyright © 2020-2023  润新知