codeforces 339D Xenia and Bit Operations 线段树裸题

题目链接

题意:

给定n,下面2^n个数。

第一次 把 a1|a2, a3|a4, 如此得到一个 2^(n-1)个数的序列。

再把这个序列 a1^a2, a3^a4 , 得到一个2^(n-2) 个数的序列

再进行 a1|a2, a3|a4 ···

直到只剩下一个数v, 我们称v是这个2^n 序列的权值。

下面m个询问:

询问格式: p, b 表示 a[p] = b; 再输出此时序列的权值。

思路:因为这个序列一定是2的倍数,所以用线段树直接这样操作即可。push_up时的深度奇偶来判断此时应该用 | 还是 ^。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
template <class T>
inline bool rd(T &ret) {
    char c; int sgn;
    if (c = getchar(), c == EOF) return 0;
    while (c != ‘-‘ && (c<‘0‘ || c>‘9‘)) c = getchar();
    sgn = (c == ‘-‘) ? -1 : 1;
    ret = (c == ‘-‘) ? 0 : (c - ‘0‘);
    while (c = getchar(), c >= ‘0‘&&c <= ‘9‘) ret = ret * 10 + (c - ‘0‘);
    ret *= sgn;
    return 1;
}
template <class T>
inline void pt(T x) {
    if (x <0) {
        putchar(‘-‘);
        x = -x;
    }
    if (x>9) pt(x / 10);
    putchar(x % 10 + ‘0‘);
}
using namespace std;
typedef long long ll;
const int N = (1<<17)+10;
#define lson (id<<1)
#define rson (id<<1|1)
#define L(id) tree[id].l
#define R(id) tree[id].r
#define V(id) tree[id].v
struct Node {
    int l, r, v;
}tree[N << 2];
int n, q, a[N];
void up(int id,int _or) {
    if(_or) V(id) = V(lson) | V(rson);
    else V(id) = V(lson) ^ V(rson);
}
void build(int l, int r, int id, int dep) {
    L(id) = l; R(id) = r;
    if (l == r) {
        V(id) = a[l];return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, lson, dep^1);
    build(mid + 1, r, rson, dep^1);
    up(id, dep);
}
void change(int p, int v, int id, int dep) {
    if (L(id) == R(id)) {
        V(id) = v;
        return;
    }
    int mid = (L(id) + R(id)) >> 1;
    if (p <= mid)change(p, v, lson, dep^1);
    else change(p, v, rson, dep^1);
    up(id, dep);
}
int main() {
    rd(n); rd(q);
    n = 1 << n;
    for (int i = 1; i <= n; i++)rd(a[i]);
    build(1, n, 1, n & 1);
    while (q--) {
        int p, b;
        rd(p); rd(b);
        change(p, b, 1, n & 1);
        pt(V(1));puts("");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 05:23:44

codeforces 339D Xenia and Bit Operations 线段树裸题的相关文章

codeforces 339C Xenia and Bit Operations(线段树水题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Bit Operations Xenia the beginner programmer has a sequence a, consisting of 2n non-negative integers: a1, a2, ..., a2n. Xenia is currently studying bit operations. To better unders

CF339D Xenia and Bit Operations线段树

把区间和改成,第一层|,第二层 ^. 每次给出一个x,y 把 第x个变成y  ,输出 sum[1]; #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #includ

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro

HDU 4027 Can you answer these queries? 线段树裸题

题意: 给定2个操作 0.把区间的每个数sqrt 2.求和 因为每个数的sqrt次数很少,所以直接更新到底,用个标记表示是否更新完全(即区间内的数字只有0,1就不用再更新了) #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #incl

POJ 3468 线段树裸题

这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了ACdreamer的模板,在此基础上自己用宏定义来精简了一下代码: 1 #include<cstdio> 2 typedef long long LL; 3 #define root int rt, int l, int r 4 #define lson rt*2, l, mid 5 #define

[线段树]Codeforces 339D Xenia and Bit Operations

Xenia and Bit Operations time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Xenia the beginner programmer has a sequence a, consisting of 2n non-negative integers: a1, a2, ..., a2n. Xenia is

【CodeForces】343D Water tree (线段树好题!还未弄懂)

/* 此题的方法除了用线段树求子树,通过标记父亲,更新儿子的方法,来更新祖先,学习了. 对于建树的方法由于并没有说明父亲与儿子的顺序,所以需要通过两次添加. 并且pre变量可以获得父亲的位置,还未弄懂! */ #define _CRT_SECURE_NO_WARNINGS #include<cstring> #include<cstdio> #include<iostream> #include<algorithm> using namespace std;

bzoj 1036 树链剖分+线段树 裸题

HYSBZ - 1036 题意:中文题 思路:树链剖分裸题,线段树写得比较搓,(在线段树上修改节点u的时候应该修改u映射到线段树后的节点序号,这里wa了半年,真的是半年) AC代码: #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector

Bzoj 3050: [Usaco2013 Jan]Seating(线段树裸题,然而区间修改标记下放和讨论Push_up很揪心)

题目链接 题意:开始有一个空白的区间,每次可能进行两个操作:A 将一个长度为p的区间加入一段连续空白的位置 L:一个区间恢复空白:要求出A不能进行的次数. 非常裸的线段树题目,用线段树统计最大的空白区间,每个节点需要记录当前区间的最长空白区间,从左端开始的最长空白区间,从右端开始的最长空白区间.Push_up的时候要讨论下,可以分别取[l,mid]和[mid+1,r]的最大空白区间,也可以用[l,mid]的从右端开始的最长空白区间+[mid+1,r]从左端开始的最大空白区间. 每次A的时候,就查