Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip

该博客主要探讨了一种图论问题的解决方案,通过深度优先搜索(DFS)遍历一棵树,并利用动态规划(DP)来计算每个节点的状态。博客中展示了如何使用C++实现这一算法,同时涉及位运算技巧。代码中定义了宏以简化代码,并计算了某个特定条件下树中边的贡献。最后,程序读取输入并输出计算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define eps  1e-2
#define gcd __gcd
#define pb push_back
#define PI acos(-1.0)
#define lowbit(x) (x)&(-x)
#define bug printf("!!!!!\n");
#define mem(x,y) memset(x,y,sizeof(x))

typedef long long LL;
typedef long double LD;
typedef pair<int,int> pii;
typedef unsigned long long uLL;

#define int long long 

const int maxn = 1e5+2;
const int INF  = 1<<30;
const int mod  = 1e9+7;

int n,a[maxn];
std::vector<int> g[maxn];
int dp[maxn][2];
int ans=0;


void dfs(int x,int fa,int dep,int k){
    int now=((a[x]&(1<<dep))?1:0);
    // cout<<now<<endl;
    dp[x][now]=1;
    dp[x][now^1]=0;
    for(int i=0;i<g[x].size();i++){
        int to=g[x][i];if(to==fa) continue;
        dfs(to,x,dep,k);
        ans+=dp[x][1]*k*dp[to][0];
        ans+=dp[x][0]*k*dp[to][1];
        if(now==1){
            dp[x][1]+=dp[to][0];
            dp[x][0]+=dp[to][1];
        }else{
            dp[x][1]+=dp[to][1];
            dp[x][0]+=dp[to][0];
        }
    }

}


void solve(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),ans+=a[i];
    for(int i=1;i<n;i++){
        int a,b;scanf("%lld%lld",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    for(int i=0;i<=20;i++)
        dfs(1,0,i,(1<<i));
    cout<<ans<<endl;
    return;
}

int32_t main()
{
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
//    ios::sync_with_stdio(false);
    int t = 1;
    //scanf("%d",&t);
    while(t--){
    //    printf("Case %d: ",cas++);
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值