CodeForces 339D Xenia and Bit Operations (线段树)
题意:给定 2的 n 次方个数,对这些数两个两个的进行或运算,然后会减少一半的数,然后再进行异或运算,又少了一半,然后再进行或运算,再进行异或,不断重复,到最后只剩下一个数,要输出这个数,然后有 m 个询问,
每个询问有 p 和 b,要求把第 p 个数改成 b,再这样运算,输出结果。
析:这个题是不是很像线段树,不过这个题不是随机询问哪个区间,区间是固定的,这样也就简单了很多,就省下了一个query函数,再就是线段树是从上到下的,所以我们要分好到底是异或还是或,然后就很简单了,
其实这个题也可以这样想,也是先构造一棵树,然后再考虑从下到上进行变,因为要改变值,所以先把最下面的改掉,然后再更新上去,这样次数比线段树少,比它更快一点,其实原理也是一样的。
代码如下:
线段树:
#include <bits/stdc++.h>
#define lson l,m,rt<<1,!ok
#define rson m+1,r,rt<<1|1,!ok using namespace std;
const int maxn = (1 << 17) + 5;
int sum[maxn<<2]; void pushup(int rt, bool ok){
if(ok) sum[rt] = sum[rt<<1] | sum[rt<<1|1];
else sum[rt] = sum[rt<<1] ^ sum[rt<<1|1];
} void build(int l, int r, int rt, bool ok){
if(l == r){
scanf("%d", &sum[rt]);
return ;
}
int m = (l+r) >> 1;
build(lson);
build(rson);
pushup(rt, ok);
} void update(int p, int b, int l, int r, int rt, bool ok){
if(l == r){
sum[rt] = b;
return ;
}
int m = (l+r) >> 1;
if(p <= m) update(p, b, lson);
else update(p, b, rson);
pushup(rt, ok);
} int main(){
int num, mm;
cin >> num >> mm;
int n = (1 << num);
bool ok = (num & 1);
build(1, n, 1, ok);
while(mm--){
int p, b;
scanf("%d %d", &p, &b);
update(p, b, 1, n, 1, ok);
printf("%d\n", sum[1]);
}
return 0;
}
另一种:
#include <bits/stdc++.h> using namespace std;
const int maxn = (1 << 18) + 5;
int a[maxn];
int num; int main(){
int n, m;
cin >> n >> m;
num = 1 << n;
for(int i = 0; i < num; ++i) scanf("%d", &a[i+num]);//构造一棵树
int cnt = 0;
int t = num;
while(t){//把所有的值算一下
t >>= 1;
for(int i = 0; i < t; ++i)
if(cnt & 1) a[t+i] = a[(t+i)<<1] ^ a[(t+i)<<1|1];
else a[t+i] = a[(t+i)<<1] | a[(t+i)<<1|1];
++cnt;//控制是或还是异或
} while(m--){
int p, b;
scanf("%d %d", &p, &b);
cnt = 0; p += num-1;
a[p] = b;
while(p){//从下到上更新
p >>= 1;
if(cnt & 1) a[p] = a[p<<1] ^ a[p<<1|1];
else a[p] = a[p<<1] | a[p<<1|1];
++cnt;
} printf("%d\n", a[1]);
}
return 0;
}
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 beginn ...
- [线段树]Codeforces 339D Xenia and Bit Operations
Xenia and Bit Operations time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- [Codeforces 339D] Xenia and Bit Operations
[题目链接] https://codeforces.com/problemset/problem/339/D [算法] 线段树模拟即可 时间复杂度 :O(MN) [代码] #include<bi ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- [Codeforces 280D]k-Maximum Subsequence Sum(线段树)
[Codeforces 280D]k-Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不 ...
- codeforces 1217E E. Sum Queries? (线段树
codeforces 1217E E. Sum Queries? (线段树 传送门:https://codeforces.com/contest/1217/problem/E 题意: n个数,m次询问 ...
- Codeforces 438D The Child and Sequence - 线段树
At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...
- Codeforces 444 C. DZY Loves Colors (线段树+剪枝)
题目链接:http://codeforces.com/contest/444/problem/C 给定一个长度为n的序列,初始时ai=i,vali=0(1≤i≤n).有两种操作: 将区间[L,R]的值 ...
随机推荐
- 第十一章 Helm-kubernetes的包管理器(下)
11.5.5 开发自己的chart k8s提供了大连官方的chart, 不过要部署微服务,还是需要开发自己的chart: 1 创建chart Helm会帮助创建目录mychart,并生成各类c ...
- js获取页面名称和路径参数
// 取当前页面名称(不带后缀名)function getPageName1(){ var a = location.href; var b = a.split("/" ...
- MySql For Windows解压缩版配置
#配置步骤 1.首先下载解压. (此处我解压到了我电脑的“E:\software\MySql”这个位置,下文以这个目录举例); 2.我的电脑右键属性,找到环境变量配置,配置环境变量,将mysql.ex ...
- Tkinter简易教程
支持python的常见GUI工具包: Tkinter 使用Tk平台 很容易得到 半标准 wxpython 基于wxWindows.跨平台越来越流行 Python Win 只能在Windows上使用 使 ...
- 一、linux搭建jenkins+github详细步骤
事情缘由: 现在在做的主要工作是通过jenkins+postman实现api的自动化测试,想要达到的效果是,api自动化测试定时跑脚本的同时,github有新的代码提交,jenkins会自动检测部署新 ...
- DNS_PROBE_FINISHED_NXDOMAIN
DNS_PROBE_FINISHED_NXDOMAIN 用如下链接清除dns即可 chrome://net-internals/#dns dns不稳定 手动绑定host即可
- JS 对输入框文本正在输入中校验
// keyup getInput.keyup(function(){ var a = parseInt(getPrice); var b = parseInt(getInput.val()); // ...
- asp.net(c#)GridView实现鼠标悬停高亮显示
搜索了一下,发现对于这种基本都使用girdview中的RowDataBound事件完成,下面看看网上提供的简单方法protected void GridView1_RowDataBound(objec ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 17—Large Scale Machine Learning 大规模机器学习
Lecture17 Large Scale Machine Learning大规模机器学习 17.1 大型数据集的学习 Learning With Large Datasets 如果有一个低方差的模型 ...
- java算法 第七届 蓝桥杯B组(题+答案) 2.生日蜡烛
2.生日蜡烛 (结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛.现在算起来,他一共吹熄了236根蜡烛.请问,他从多少岁开始过生日party的?请填写他开 ...