首页 > 其他 > 详细

[CF339D] Xenia and Bit Operation - 线段树

时间:2021-02-21 09:22:36      阅读:26      评论:0      收藏:0      [点我收藏+]

[CF339D] Xenia and Bit Operation - 线段树

Description

给定一个序列,每次选择一个点修改权值,然后求出全序列的值(每相邻两个元素按位或得到长度减半的序列,在对每相邻两个元素按位异或得到长度再次减半的序列……更替的进行按位或/异或)

Solution

不用想太多,直接线段树维护即可

#include <bits/stdc++.h>
using namespace std;

#define int long long

struct SegmentTree
{
    struct Node
    {
        int val;
        int flag;

        Node operator+(const Node &rhs)
        {
            if (flag)
                return {val ^ rhs.val, 0};
            else
                return {val | rhs.val, 1};
        }
    };

    vector<Node> nodes;

    int n;

    SegmentTree(int n) : n(n)
    {
        nodes.resize(4 * n + 4);
    }

    void pushup(int p)
    {
        nodes[p] = nodes[p * 2] + nodes[p * 2 + 1];
    }

    void build(int p, int l, int r, const vector<int> &src)
    {
        if (l == r)
        {
            nodes[p] = {src[l], 0};
        }
        else
        {
            build(p * 2, l, (l + r) / 2, src);
            build(p * 2 + 1, (l + r) / 2 + 1, r, src);
            pushup(p);
        }
    }

    void modify(int p, int l, int r, int pos, int val)
    {
        if (l == r)
        {
            nodes[p] = {val, 0};
        }
        else
        {
            if (pos <= (l + r) / 2)
                modify(p * 2, l, (l + r) / 2, pos, val);
            else
                modify(p * 2 + 1, (l + r) / 2 + 1, r, pos, val);
            pushup(p);
        }
    }

    void Build(const vector<int> &src)
    {
        build(1, 1, n, src);
    }

    void Modify(int pos, int key)
    {
        modify(1, 1, n, pos, key);
    }

    int Query()
    {
        return nodes[1].val;
    }
};

signed main()
{
    ios::sync_with_stdio(false);

    int n, m;
    cin >> n >> m;
    n = 1 << n;

    vector<int> a(n + 2);
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    SegmentTree seg(n);
    seg.Build(a);

    for (int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        seg.Modify(x, y);
        cout << seg.Query() << endl;
    }
}

[CF339D] Xenia and Bit Operation - 线段树

原文:https://www.cnblogs.com/mollnn/p/14424113.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!