CodeForces 339D Xenia and Bit Operations(线段树点修改)
来源:互联网 发布:汇编和c语言先学哪个 编辑:程序博客网 时间:2024/05/18 17:27
题目链接:
http://codeforces.com/problemset/problem/339/D
解题思路:
题目大意:
输入n和m分别表示有2^n个数和m个更新,每次更新只把p位置的值改成b,然后输出整个序列运算后的值,但是这个运算比较麻烦, 最下面一层数字两两之间进行或运算得到原来数目一半的数字,然后剩下的再两两之间进行异或运算,再得到一半,然后再或,再异或。。。。。。直到得到一个数字为止,这个数字就是每次询问的结果。
算法思想:
如果只有一种运算,就是简单的线段树点更新,区间查询问题。然而现在,我们要确定什么时候用or 什么时候用xor, 不过想想看,最下面一层是用or, 总共有n层,因为or和xor是交替进行的,所以我们就可以用n确定每层的运算,然后在建树和更新的时候分情况讨论就可以了。
AC代码:
#include <iostream>#include <cstdio>using namespace std;const int maxn = 1<<17+5;struct node{ int l,r; int sum;}tree[maxn<<2];int a[maxn];void build(int id,int l,int r,int op){ tree[id].l = l; tree[id].r = r; if(l == r){ tree[id].sum = a[l]; return; } int mid = (l+r)>>1; build(id<<1,l,mid,-op); build(id<<1|1,mid+1,r,-op); if(op == 1) tree[id].sum = tree[id<<1].sum^tree[id<<1|1].sum; else tree[id].sum = tree[id<<1].sum|tree[id<<1|1].sum;}void update(int id,int x,int val,int op){ if(tree[id].l == x && tree[id].r == x){ tree[id].sum = val; return; } int mid = (tree[id].l+tree[id].r)>>1; if(x <= mid) update(id<<1,x,val,-op); else update(id<<1|1,x,val,-op); if(op == 1) tree[id].sum = tree[id<<1].sum^tree[id<<1|1].sum; else tree[id].sum = tree[id<<1].sum|tree[id<<1|1].sum;}int query(int id,int l,int r){ if(tree[id].l == l && tree[id].r == r){ return tree[id].sum; } int mid = (tree[id].l+tree[id].r)>>1; if(r <= mid) return query(id<<1,l,r); if(l > mid) return query(id<<1|1,l,r); return query(id<<1,l,mid)^query(id<<1|1,mid+1,r);}int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ int num = 1<<n,op; for(int i = 1; i <= num; i++) scanf("%d",&a[i]); if(n&1) op = -1;//或 else op = 1;//异或 build(1,1,num,op); int a,b; while(m--){ scanf("%d%d",&a,&b); update(1,a,b,op); printf("%d\n",query(1,1,num)); } } return 0;}
0 0
- CodeForces 339D Xenia and Bit Operations(线段树点修改)
- codeforces 339 D.Xenia and Bit Operations(线段树)
- CodeForces 339D Xenia and Bit Operations(线段树)
- 文章标题 coderforces 339D : Xenia and Bit Operations (线段树+点修改)
- codeforces 339D Xenia and Bit Operations 线段树
- CodeForces 339D Xenia and Bit Operations 线段树
- Codeforces 339D Xenia and Bit Operations 线段树
- CodeForces 339D Xenia and Bit Operations (线段树水题)
- CodeForces 339D Xenia and Bit Operations 数据结构+线段树+点更新
- Codeforces 339D Xenia and Bit Operations 线段树单点修改
- CodeForces 339D Xenia and Bit Operations
- CodeForces 339D Xenia and Bit Operations
- CodeForces 339D D. Xenia and Bit Operations(线段树的单点更新)
- CF 339D - Xenia and Bit Operations(线段树)
- Codeforces Round #197 (Div. 2) -- D. Xenia and Bit Operations(线段树)
- Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations(线段树)
- Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations - 线段树
- [题解]codeforces 339d Xenia and Bit Operations
- 进程间通讯-----aidl
- Selenium学习---(三)
- linux安装telnet服务(server)
- 字符串之单词原地逆转
- java基础关于java排序(一)
- CodeForces 339D Xenia and Bit Operations(线段树点修改)
- 安卓开发中应用欢迎页的简单实现
- MVCD动态生成a标签
- POJ 1419 最大独立集(即最大团)
- UVA 11248 Frequency Hopping (最大流)
- APM,AF和AS的设计思想
- ShutdownHook
- 清除行列
- 关于UIViewController添加UINavigationBar的详细实现方法