codeforces766E. Mahmoud and a xor trip(DP)

5人阅读 评论(0) 收藏 举报
分类:

题意:给定一棵树 每个节点有权值 任意选两个点i和j满足i<=j其贡献为i到j路径所有点的xor和 求所用点对的和

题解:感觉带xor的题从位运算考虑会好很多 于是对于每个点枚举每一位 对于每一位dp[i][0]表示从i点开始这一位xor和为0的路径数 那么dp[i][1]同理

设j为这个点的儿子 那么转移就把他所有儿子的贡献加起来 如果i这一位为0 dp[i][0] += dp[j][0], dp[i][1] += dp[j][1] 为1同理
然后从1开始dfs一遍就可 最开始还奇怪假如1 - 3 - 2这样的图 dfs一遍好像答案不对 然而并不是 这样dfs统计的顺序是3 - 2, 1 - 3, 1 - 3 - 2.  3 - 2和2 - 3是一样的 所以具有正确性,听说这是种套路题.....
             
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll ans;
vector<int> g[100005];
ll q[100005];
ll dp[100005][2];

void dfs(int x, int fa, int pos)
{
    int c = q[x] >> pos & 1;
    dp[x][c] = 1;
    for(int i = 0; i < g[x].size(); i++)
    {
        if(g[x][i] == fa) continue;
        dfs(g[x][i], x, pos);

        ans += (1LL << pos) *  dp[x][1] * dp[g[x][i]][0];
        ans += (1LL <<pos) * dp[x][0] * dp[g[x][i]][1];
        if(c == 0) dp[x][0] += dp[g[x][i]][0], dp[x][1] += dp[g[x][i]][1];
        else dp[x][0] += dp[g[x][i]][1], dp[x][1] += dp[g[x][i]][0];
    }
}

int main()
{
    ans = 0;
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%lld", &q[i]), ans += q[i];

    for(int i = 1; i < n; i++)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }

    for(int i = 0; i < 20; i++)
    {
        memset(dp, 0, sizeof(dp));
        dfs(1, 0, i);
    }
    printf("%lld\n", ans);
    return 0;
}


查看评论

E. Mahmoud and a xor trip----树形DP

E. Mahmoud and a xor trip time limit per test 2 seconds memory limit per test 256 megaby...
  • bless924295
  • bless924295
  • 2017-02-08 21:29:35
  • 360

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

E. Mahmoud and a xor trip time limit per test 2 seconds memory limit per test 256 megaby...
  • overload1997
  • overload1997
  • 2017-02-10 20:11:28
  • 317

Codeforces - 862C Mahmoud and Ehab and the xor

C. Mahmoud and Ehab and the xor Mahmoud and Ehab are on the third stage of their adventures...
  • lzc504603913
  • lzc504603913
  • 2017-09-20 15:55:20
  • 654

Codeforces Round #435 (Div. 2) C. Mahmoud and Ehab and the xor

Mahmoud and Ehab are on the third stage of their adventures now. As you know, Dr. Evil likes sets. T...
  • SSimpLe_Y
  • SSimpLe_Y
  • 2017-09-20 08:58:35
  • 627

Mahmoud and a xor trip——766E 树形dp

E. Mahmoud and a xor trip 第一眼好假啊。。 题意:给定一棵树,树上的点有权值,求所有无序点对(x,y)间路径的和,a->b的路径定义为a到b经过的所有的权值异或值 ...
  • Fop_zz
  • Fop_zz
  • 2017-06-13 09:35:17
  • 140

CF766E:Mahmoud and a xor trip(树形dp)

E. Mahmoud and a xor trip time limit per test 2 seconds memory limit per test 256 megaby...
  • junior19
  • junior19
  • 2017-07-28 18:01:38
  • 72

codeforces766E - Mahmoud and a xor trip

题面在这里题意:给一棵树,每个点有点权。 询问任意两点路径上点权的异或和。做法:由于是异或和,可以先枚举每一位,分别DP。 记f[u][0/1]为以u为根的子树中,路径异或值为0/1的点对数量。 ...
  • bestFy
  • bestFy
  • 2018-01-03 15:44:58
  • 64

Codeforces 862 C. Mahmoud and Ehab and the xor (技巧)

Description Mahmoud and Ehab are on the third stage of their adventures now. As you know, Dr. Evil...
  • qq_28954601
  • qq_28954601
  • 2017-09-20 18:06:18
  • 395

Codeforces Round #435 (Div. 2)-Mahmoud and Ehab and the xor(异或)

C. Mahmoud and Ehab and the xor time limit per test 2 seconds memory limit per test 256 ...
  • haut_ykc
  • haut_ykc
  • 2017-09-20 19:10:12
  • 247

Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基

题意 给出一个长度为n的数组A和q个询问,每次询问给出两个数l和x,问有多少种方案从前l个元素中取若干个出来使得其异或和恰好为x。取模。 n,q≤105,Ai&amp;lt;220n,q≤105,...
  • qq_33229466
  • qq_33229466
  • 2018-04-07 09:14:25
  • 69
    个人资料
    持之以恒
    等级:
    访问量: 1072
    积分: 103
    排名: 119万+
    文章存档