zoukankan      html  css  js  c++  java
  • CF1009F Dominant Indices 长链剖分

    这道题里需要用到指针.   

    这里讲一下指针的一些基本操作:  

    首先,我们要分配一些内存,然后分配一个指针来指向这个内存:

    int pp[N],*p=pp,*f[N];
    

    这里指针的空间都会被分配到 pp 里.     

    假如说我们想给 $f[x]$ 分配一些内存,我们就令 $f[x]=p$,$p leftarrow p+need[x]$.      

    指针是连续的,也就是说 $f[x]$ 的分配是 $[L_{x},L_{x}+need[x]]$,然后下一次 $p$ 就从 $L_{x}+need[x]+1$ 开始分配内存了.     

    所以假如调用 $f[x][need[x]+1]$ 的话就会访问到其他数组.   

    由于长链剖分中对于每一条长链开一个数组就够了,所以我们可以令 $f[son[x]]=f[x]+1$,这样 $f[son[x]]$ 就从 $f[x]$ 的地址+1 开始存储东西了.     

    总结:注意空间分配就行.   

    code:   

    #include <bits/stdc++.h>
    #define N 1003009    
    #define setIO(s) freopen(s".in","r",stdin)  
    using namespace std;  
    int edges,n; 
    int pp[N],*p=pp,*f[N],ans[N],son[N],dep[N];    
    int hd[N],to[N<<1],nex[N<<1];  
    void add(int u,int v) {  
        nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;  
    }   
    void dfs1(int x,int ff) { 
        dep[x]=1;    
        for(int i=hd[x];i;i=nex[i]) {   
            int y=to[i];  
            if(y==ff) continue;   
            dfs1(y,x);  
            if(dep[y]+1>dep[x]) { 
                dep[x]=dep[y]+1;  
                son[x]=y;  
            }
        }
    }
    void dfs2(int x,int ff) {       
        f[x][0]=1;   
        if(son[x]) {   
            f[son[x]]=f[x]+1;  
            dfs2(son[x],x);  
            ans[x]=ans[son[x]]+1;   
        }        
        for(int i=hd[x];i;i=nex[i]) { 
            int y=to[i];  
            if(y==ff||y==son[x]) continue;   
            f[y]=p,p+=dep[y];                                                     
            dfs2(y,x);  
            for(int j=1;j<=dep[y];++j) {  
                f[x][j]+=f[y][j-1];                   
                if(f[x][j]>=f[x][ans[x]]) {     
                    if(f[x][j]>f[x][ans[x]]) {      
                        ans[x]=j;  
                    }  
                    else if(j<ans[x]) ans[x]=j;   
                }
            }        
        }
        if(f[x][ans[x]]==1) ans[x]=0;             
    }
    int main() { 
        // setIO("input");        
        scanf("%d",&n);   
        int x,y,z; 
        for(int i=1;i<n;++i) {  
            scanf("%d%d",&x,&y);   
            add(x,y),add(y,x);  
        }    
        dfs1(1,0);     
        f[1]=p,p+=dep[1];      
        dfs2(1,0);  
        for(int i=1;i<=n;++i) printf("%d
    ",ans[i]);  
        return 0;  
    }
    

      

  • 相关阅读:
    自定义动画animate()
    【Java】正则表达式
    【Java】连接数据库SQLServer
    【Java】导入导出TXT文件
    【数据库】SELECT语句
    数据结构与算法系列之目录
    【Java】员工统计
    【Java】生产者消费者模式
    【Java】购物超市
    【Java】导入导出Excel表格
  • 原文地址:https://www.cnblogs.com/guangheli/p/13321794.html
Copyright © 2011-2022 走看看