牛客编程巅峰赛S2第3场 - 青铜&白银&黄金 C Tree VI

牛牛打怪

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

根据题面,可以发现前面层都是完全二叉树,所以可以先预处理出,每一层的节点个数,然后一直往左生儿子,在加上当前节点后如果超过了总结点就返回,先序遍历是一直先往左走,所以需要预处理出当前节点之前的完全二叉树的节点个数,可以根据代码具体理解.

const long long N=1e5+10;
class Solution {
public:
    typedef long long ll;
    ll n=0;
    ll lim=0;
    ll cnt=0;
    ll tot=0;
    ll res=0;
    ll num[N];
    ll head[N];
    ll base[N],pre[N];
    struct Edge{
        int u,v;
    }edge[N<<1];
    void add(ll x, ll y) {
        edge[++tot].u=head[x];
        edge[tot].v=y;
        head[x]=tot;
    }
    void dfs(ll now, ll loc, ll fa, ll dep) {
        if(now!=1) {
            add(now, fa);
            add(fa, now);
        }
        for(ll i=1; i<=lim; ++i) {
            if(pre[dep]>=n || pre[dep]+lim*(loc-1)+i>n) return;
            dfs(++cnt,lim*(loc-1)+i,now,dep+1);
        }
    }
    void dfs_two(ll now, ll fa) {
        if(now!=1) res+=(num[now]^num[fa]);
        for(ll i=head[now]; i; i=edge[i].u) {
            int to=edge[i].v;
            if(to==fa) continue;
            dfs_two(to,now);
        }
    }
    ll tree6(int k, vector<int>& a) {
        n=a.size();
        lim=k*1ll;
        for(int i=0; i<n; ++i) num[i+1]=a[i]*1ll;
        pre[0]=base[0]=1;
        for(int i=1; i<=n; ++i) base[i]=base[i-1]*lim;
        for(int i=1; i<=n; ++i) pre[i]=pre[i-1]+base[i];
        dfs(++cnt,1,0,0);
        dfs_two(1,0);
        return res;
   }
};
全部评论

相关推荐

缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务