列表

详情


NC207264. TreeV

描述

系统中有一棵n个点的完全二叉树,现给出它的DFS正序遍历序列a_i(即从根节点开始,先遍历左子树,后遍历右子树),请你还原这棵树,并返回加密后的答案。
答案加密方法:所有边两个端点异或的和,即,其中(u_i, v_i)为一条树上的边。

完全二叉树:若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边。
样例构成的完全二叉树为:

输入描述

数据满足:


示例1

输入:

[1,2,3,4,5]

输出:

14

说明:

树边为(1, 2), (1, 5), (2, 3), (2, 4),加密过程为(1^2)+(1^5)+(2^3)+(2^4),答案为14。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 161ms, 内存消耗: 30188K, 提交时间: 2020-07-31 21:25:06

import java.util.*;


public class Solution {
    /**
     * 
     * @param a int整型一维数组 表示这棵完全二叉树的Dfs遍历序列的结点编号
     * @return long长整型
     */
    int n=0;
    long dfs(int[] a,int k){
        if(k>a.length)return 0;
        int now=a[n++];
        long ans=0;
        if(2*k<=a.length){
            ans+=now^a[n];
            ans+=dfs(a,2*k);
        }
        if(2*k+1<=a.length){
            ans+=now^a[n];
            ans+=dfs(a,2*k+1);
        }
        return ans;
    }
    public long tree5 (int[] a) {
        // write code here
        n=0;
        return dfs(a,1); 
    }
}

C++11(clang++ 3.9) 解法, 执行用时: 38ms, 内存消耗: 5008K, 提交时间: 2020-08-09 11:13:46

class Solution
{
	public:
		vector<int> R;
		long long ans=0;
		int n,tot=-1;
		void DFS(int x,int fa)
		{
			int t=R[++tot];
			if(fa) ans+=t^fa;
			if(2*x<=n) DFS(2*x,t);
			if(2*x+1<=n) DFS(2*x+1,t);
		}
		long long tree5(vector<int> &a)
		{
			n=a.size(),R=a,DFS(1,0);
			return ans;
		}
 };

Go(1.14.4) 解法, 执行用时: 29ms, 内存消耗: 11048K, 提交时间: 2020-07-30 22:07:28

package main

// github.com/EndlessCheng/codeforces-go
func tree5(a []int) int64 {
	n, s, i := len(a), 0, 0
	var f func(int) int
	f = func(p int) int {
		v := a[i]
		i++
		if p*2 <= n {
			s += v ^ f(p*2)
		}
		if p*2+1 <= n {
			s += v ^ f(p*2+1)
		}
		return v
	}
	f(1)
	return int64(s)
}

上一题