【每日一题】2021年3月29日题目精讲

题号 NC200547
名称 划分树
来源 牛客练习赛57
每日一题三期汇总贴~

图片说明
如果你在题库做题时遇到了喜欢的题目,欢迎推荐给邓老师~ 点击查看详情
欢迎给每日一题投稿,投稿需要提供牛客题库里的题目+题解 投稿有牛币奖励,可发站内信给王清楚或联系QQ 234186389
每日一题QQ群:659028468

题解

作者:喵渺淼妙的死忠粉
前言
=

题解的解法的赋初值是真没看懂..看了大佬的代码顺便问了大佬数组的含义才懂的这个题..

思路

首先可以知道为根的只有当子树的异或和为才有答案.
其他情况是没有答案的,所以我们可以重构一下树,将树中异或和为的点存起来.
假如,答案显然是.
假如,那么就需要跑树形了.
我们定义表示到了这个节点,的连通块的异或和为的方案数.
很显然的初值是假如这个点标记为,那么.
否则这个点的值就是,那么.
然后通过子树进行转移.
显然:

.

.

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1004535809;
const int N=5e5+5;
ll n,M,w[N],id;
ll f[N][2],dp[N][2];
vector<int>g[N];
vector<int>G[N];
bool flag[N];
void dfs1(int u)
{
    for(int v:g[u])
    {
        dfs1(v);
        if(w[v]!=M) w[u]^=w[v];
    }
}

void dfs2(int u,int root)
{
    if(w[u]==0)
    {
        G[root].push_back(++id);
        flag[id]=true;
        root=id;
    }
    else if(w[u]==M)
    {
        G[root].push_back(++id);
        root=id;
    }
    for(int v:g[u])
        dfs2(v,root);
}

ll qp(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1)    res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

void dfs3(int u)
{
    if(flag[u])    f[u][0]=1;
    else        f[u][1]=1;
    for(int v:G[u])
    {
        dfs3(v);
        dp[u][0]=(f[u][0]*f[v][0]%mod+f[u][1]*f[v][1]%mod+f[u][0]*f[v][1]%mod)%mod;
        dp[u][1]=(f[u][1]*f[v][0]%mod+f[u][1]*f[v][1]%mod+f[u][0]*f[v][1]%mod)%mod;
        f[u][0]=dp[u][0],f[u][1]=dp[u][1];
    }
}

int main()
{
    scanf("%lld%lld",&n,&M);
    for(int i=1;i<n;i++)
    {
        int u;
        scanf("%d",&u);
        g[u].push_back(i+1);
    }
    for(int i=1;i<=n;i++)    scanf("%lld",&w[i]);
    dfs1(1);
    if(w[1]!=M&&w[1]!=0)
    {
        puts("0");
        return 0;
    }
    dfs2(1,0);
    if(M==0)
    {
        printf("%lld\n",qp(2,id-1));
        return 0;
    }
    dfs3(1);
    printf("%lld\n",f[1][1]);
    return 0;
}

欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!

活动奖励:

在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)

本道题目4月5日中午12:00之前写的题解有获得牛币资格~

.牛币兑换中心

牛客博客开通方式

  1. 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
  2. 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
  3. 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴
全部评论
https://blog.nowcoder.net/n/e619874ed9d14a469647d4c1e9b9976e
点赞 回复 分享
发布于 2021-04-02 17:46
感觉这玩意更难理解了
点赞 回复 分享
发布于 2021-11-13 23:22

相关推荐

会员标识
02-20 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
01-16 18:34
四川大学 Java
欢迎加入AI:没有啥稳定不稳定,一切都源于业务快速发展还是收缩。我当年一开始去的央企,业务不赚钱,也贼卷,慢慢就开始优化了。。。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务