C题

简单的公式

https://ac.nowcoder.com/acm/contest/9247/A

一遍dfs赋值 一遍计算异或和
class Solution {
public:
    /**
     * 
     * @param k int整型 表示完全k叉树的叉数k
     * @param a int整型vector 表示这棵完全k叉树的Dfs遍历序列的结点编号
     * @return long长整型
     */
    #define ll long long
ll as[100010],b[100010];
ll kf,cnt=0,n;
void dfs(ll s) //先序遍历
{
    b[s]=as[cnt];  cnt 控制先序遍历下标
    cnt++;
    for(int i=-1*(kf-2);i<2;i++) 
    {
        ll pos=i+s*kf;
        if(pos<=n) dfs(pos);
        else break;
    }
}
ll dfs2(int s)
{
    ll ans=0;
    for(int i=-1*(kf-2);i<2;i++)
    {
        ll pos=i+s*kf;
        if(pos<=n) ans+=(b[s]^b[pos])+dfs2(pos);
        else break;
    }
    return ans;
}
    long long tree6(int k, vector<int>& a) {
        // write code here
    kf=k;
    n=a.size();
    ll res=0;
    for(int i=0;i<n;i++)
    as[i]=a[i];
    if(k==1)
    {
        for(int i=1;i<n;i++)
            res+=as[i-1]^as[i];
        return res;
    }
    else 
    {
        dfs(1);
        ll ans=dfs2(1);
        return ans;
    }
    }

};

全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务