zoukankan      html  css  js  c++  java
  • CF1009F Dominant Indices 解题报告

    CF1009F Dominant Indices

    题意简述

    给出一颗以(1)为跟的有根树,定义(d_{i,j})为以(i)为根节点的子树中到(i)的距离恰好为(j)的点的个数,对每个点求出一个最小的(j)使得(d_{i,j})最大


    这个长链剖分的小trick感觉和树上分组背包的复杂度有点神似啊,据说和dsu on tree也有点像?

    暴力的(dp_{i,j})代表与(i)点相距为(j)的点的个数,复杂度(O(n^2))

    对每个点按重量维护重儿子,然后每个点直接继承重儿子的信息,暴力合并轻儿子的信息,这样每个点的信息只会在重链链头的父亲被合并一次,复杂度(O(n))

    关于继承重儿子,我抄了个很厉害的指针写法。注意要格外在意是不是访问了不该访问的空间。


    Code:

    #include <cstdio>
    const int N=1e6+10;
    int max(int x,int y){return x>y?x:y;}
    int head[N],to[N<<1],Next[N<<1],cnt;
    void add(int u,int v)
    {
        to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
    }
    int dis[N],ws[N],ans[N],n;
    void dfsinit(int now,int fa)
    {
        dis[now]=1;
        for(int v,i=head[now];i;i=Next[i])
            if((v=to[i])!=fa)
            {
                dfsinit(v,now);
                if(dis[ws[now]]<dis[v]) ws[now]=v;
                dis[now]=max(dis[now],dis[v]+1);
            }
    }
    int sav[N],*it=sav,*dp[N];
    void dfs(int now,int fa)
    {
        dp[now][0]=1;
        if(ws[now]) dp[ws[now]]=dp[now]+1,dfs(ws[now],now),ans[now]=ans[ws[now]]+1;
        for(int v,i=head[now];i;i=Next[i])
            if((v=to[i])!=fa&&v!=ws[now])
            {
                dp[v]=it,it+=dis[v];
                dfs(v,now);
                for(int j=1;j<=dis[v];j++)
                {
                    dp[now][j]+=dp[v][j-1];
                    if((j>ans[now]&&dp[now][j]>dp[now][ans[now]])||(j<ans[now]&&dp[now][j]>=dp[now][ans[now]]))
                        ans[now]=j;
                }
            }
        if(dp[now][ans[now]]==1) ans[now]=0;
    }
    int main()
    {
        scanf("%d",&n);
        for(int u,v,i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
        dfsinit(1,0);
        dp[1]=it,it+=dis[1];
        dfs(1,0);
        for(int i=1;i<=n;i++) printf("%d
    ",ans[i]);
        return 0;
    }
    

    2018.12.13

  • 相关阅读:
    Docker-常用命令
    5分钟了解折半插入排序
    Spring框架之IOC原理
    使用JS实现简单喷泉效果
    坦克大战系列6-API常用函数说明1
    坦克大战系列6-API常用函数说明2
    为什么要使用-Docker
    SQL语言:存储过程
    使用原生JS重构简单的音乐播放器
    [区间DP]ZOJ3541 The Last Puzzle
  • 原文地址:https://www.cnblogs.com/butterflydew/p/10115308.html
Copyright © 2011-2022 走看看