这个题目属于线段树的点更新区间查询,而且查的是整个区间,其实不用写query()函数,只需要输出根节点保存的值就可以了。

题意:

输入n,m表示有2^n个数和m个更新,每次更新只把p位置的值改成b,然后输出整个序列运算后的值,而这个运算就比较复杂了, 最下面一层两个数字之间或运算得到原来数目一半的数字,然后两个之间异或运算,得到一半,再或再异或………………,一直到得到一个数字,这个数字就是要求的结果。

思路:

如果只是一种运算,这就是简单的线段树点更新,区间查询。而现在,我们要确定什么时候用or 什么时候用xor, 想想看,最下面一层是用or, 总共有n层,因为or和xor是交替进行的,我们就可以用n确定每层的运算,然后在建树和更新的时候分情况讨论。

代码如下:

#include <stdio.h>
#include <string.h>
const int maxn = (1<<17) + 5; struct node
{
int l, r;
int x;
}tree[maxn<<2];
int arr[maxn]; void build(int l, int r, int o, int d)
{
tree[o].l = l;
tree[o].r = r;
if (l == r)
{
tree[o].x = arr[l];
return ;
}
int mid = (l + r) >> 1;
build(l, mid, o<<1, -d);
build(mid+1, r, o<<1|1, -d);
if (d == 1)
tree[o].x = tree[o<<1].x^tree[o<<1|1].x;
else
tree[o].x = tree[o<<1].x|tree[o<<1|1].x;
} int query(int l, int r, int o)
{
if (tree[o].l == l && tree[o].r == r)
return tree[o].x;
int mid = (tree[o].l + tree[o].r) >> 1;
if (r <= mid)
return query(l, r, o<<1);
else if (l > mid)
return query(l, r, o<<1|1);
else
return query(l, mid, o<<1)^query(mid+1, r, o<<1|1);
} void update(int x, int v, int o, int d)
{
if (tree[o].l == tree[o].r && tree[o].l == x)
{
tree[o].x = v;
return;
}
int mid = (tree[o].l + tree[o].r) >> 1;
if (x <= mid)
update(x, v, o<<1, -d);
else
update(x, v, o<<1|1, -d);
if (d == 1)
tree[o].x = tree[o<<1].x^tree[o<<1|1].x;
else
tree[o].x = tree[o<<1].x|tree[o<<1|1].x;
} int main()
{
int n, m;
int p, b, d;
while (scanf("%d %d", &n, &m) != EOF)
{
int num = 1<<n;
for (int i = 1; i <= num; i++)
scanf("%d", &arr[i]);
if (n&1)
d = -1;
else
d = 1;
build(1, num, 1, d);
while (m--)
{
scanf("%d %d", &p, &b);
update(p, b, 1, d);
printf("%d\n", query(1, num, 1));
}
}
return 0;
}

codeforces 339 D.Xenia and Bit Operations(线段树)的更多相关文章

  1. [codeforces 339]D. Xenia and Bit Operations

    [codeforces 339]D. Xenia and Bit Operations 试题描述 Xenia the beginner programmer has a sequence a, con ...

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

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Bit Operations Xenia the beginn ...

  3. 【Codeforces 339】Xenia and Bit Operations

    Codeforces 339 D 题意:给定\(2^n​\)个数字,现在把它们进行如下操作: 相邻的两个数取\(or\) 相邻的两个数取\(xor\) 以此类推,直到剩下一个数. 问每次修改一个数字, ...

  4. CodeForces 339D Xenia and Bit Operations (线段树)

    题意:给定 2的 n 次方个数,对这些数两个两个的进行或运算,然后会减少一半的数,然后再进行异或运算,又少了一半,然后再进行或运算,再进行异或,不断重复,到最后只剩下一个数,要输出这个数,然后有 m ...

  5. CF 197 DIV2 Xenia and Bit Operations 线段树

    线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...

  6. [codeforces 339]C. Xenia and Weights

    [codeforces 339]C. Xenia and Weights 试题描述 Xenia has a set of weights and pan scales. Each weight has ...

  7. Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树

    C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...

  8. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  9. CodeForces 587 E.Duff as a Queen 线段树动态维护区间线性基

    https://codeforces.com/contest/587/problem/E 一个序列, 1区间异或操作 2查询区间子集异或种类数 题解 解题思路大同小异,都是利用异或的性质进行转化,st ...

随机推荐

  1. java 字节码指令集

    This is a list of the instructions that make up the Java bytecode, an abstract machine language that ...

  2. GitLab通过API创建项目

    示例: #!/usr/bin/python # -*- coding:utf-8 -*- import os import json import requests import subprocess ...

  3. Programming In Lua 第五章

    1, 2, 3, 4, 5, 6, 7, 8, 9, 第9点非常重点. 10,

  4. 【数据库】Navicat Premium12远程连接MySQL数据库

    目录 00. 目录 01. 环境介绍 02. Navicat安装 03. MySQL开启远程登录权限 04. Navicat连接MySQL 00. 目录 @ 参考博客:https://blog.csd ...

  5. Codeforces Gym101518E:The Pharaoh's Curse(BFS + 离散化)

    题目链接 题意 给出一个n*m的地图,人的当前位置是'S',还有不超过两个的箱子'X',任意多个按钮'B',不超过100个可以走的点'.',还有一个在边界的出口'E',当且仅当所有的按钮都被箱子盖住的 ...

  6. Spring 注解编程之注解属性别名与覆盖

    前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...

  7. Windows 下配置 Logstash 为后台服务

    到目前为止,logstash 没有给出官方的,在 windows 系统中作为后台服务运行的方式.本文将介绍如何使用第三方工具 nssm 让 logstash 作为后台服务运行在 windows 中.说 ...

  8. Skyline WEB端开发2——添加一个定位点、文本标签

    Skyline 添加定位点 sgworld.Creator.CreatePosition CreatePosition( X, //兴趣点的东西方向坐标,即经度 Y, //兴趣点的南北方向坐标,即纬度 ...

  9. Bzoj 1040 [ZJOI2008]骑士 题解

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5368  Solved: 2044[Submit][Status ...

  10. How to Read a Paper丨如何阅读一篇论文

    这是我在看论文时无意刷到的博客推荐的一篇文章"How to Read a Paper",教你怎么样看论文.对于研究生来说,看论文基本是日常,一篇论文十多二十页,如何高效地读论文确实 ...