RMQ(或运算)
RMQ
https://ac.nowcoder.com/acm/contest/283/J
题目描述
按位或运算:处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。例如5 or 3 = 7
0101(十进制5)
OR 0011(十进制3)
= 0111(十进制7)—— 引用自 位运算——维基百科
输入描述:
输出描述:
对于每个SUM操作,在一行内输出该操作的结果。
输入例子:
5 3
1 2 3 4 5
SUM 1 4
OR 2 5 10
SUM 1 4
输出例子:
10
36
-->
输入
5 3
1 2 3 4 5
SUM 1 4
OR 2 5 10
SUM 1 4
输出
10
36
说明
在第一个SUM操作时数组a为[1, 2, 3, 4, 5],因此[1,4]和为10 在第二个SUM操作时数组a为[1, 10, 11, 14, 15],因此[1,4]和为36
#include<bits/stdc++.h>
#define maxn 200005
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
typedef long long ll;
using namespace std;
ll tree[maxn<<],lazy[maxn<<]; int n,m; void push_up(int rt){
tree[rt]=tree[rt<<]+tree[rt<<|];
lazy[rt]=lazy[rt<<]|lazy[rt<<|];
} void build(int l,int r,int rt){
if(l==r){
cin>>tree[rt];
lazy[rt]=~tree[rt];
return;
}
int mid=(l+r)/;
build(lson);
build(rson);
push_up(rt);
} ll query(int L,int R,int l,int r,int rt){
if(L<=l&&R>=r){
return tree[rt];
}
ll ans=;
int mid=(l+r)/;
if(L<=mid) ans+=query(L,R,lson);
if(R>mid) ans+=query(L,R,rson);
push_up(rt);
return ans;
} void add(int L,int R,int v,int l,int r,int rt){
if(l==r){
tree[rt]+=lazy[rt]&v;
lazy[rt]-=lazy[rt]&v;
return;
}
int mid=(l+r)/;
if(!(lazy[rt]&v)) return;
if(L<=mid) add(L,R,v,lson);
if(R>mid) add(L,R,v,rson);
push_up(rt); } int main(){
std::ios::sync_with_stdio(false);
cin>>n>>m;
build(,n,);
string str;
int x,y,v;
while(m--){
cin>>str>>x>>y;
if(x>y) swap(x,y);
if(str=="SUM"){
cout<<query(x,y,,n,)<<endl;
}
else{
cin>>v;
add(x,y,v,,n,);
}
} }
RMQ(或运算)的更多相关文章
- 基于DP+位运算的RMQ算法
来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n) ...
- LCA和RMQ
下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...
- 区间RMQ问题
简介 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值 ...
- RMQ算法区间最值
问题类型:是多次询问一个大区间里子区间的最值问题 dp + 位运算的思想处理 rmax[i][j]表示从i开始到i + 2^j - 1的区间里的最大值dp[i][j] ==== (i,i + 2^j ...
- [模板]RMQ(冲刺准备中)
洛谷P3865 注意:位运算一定要加括号!因为他的优先级没有加减法高: 注意在预处理的时候判断的是前一个区间是否完整,故 i+(1<<(j-1))-1<=n; 取logn时最好多加一 ...
- 谈谈RMQ问题
没用的话:好像好久没更博了,无聊就讲讲算法吧(主要找不到水题). 感觉针对初学者,老师教这个算法时没怎么懂,最近(大概1.2个月前吧)老师又教了lca(最近公共祖先,额,可以百度,我就不讲了,可能以后 ...
- RMQ问题+ST算法
一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...
- HDU 6194 string string string(后缀数组+RMQ)
string string string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 动态规划——稀疏表求解RMQ问题
RMQ (Range Minimum/Maximum Query)问题,即区间最值查询问题,是求解序列中的某一段的最值的问题.如果只需要询问一次,那遍历枚举(复杂度O(n))就是最方便且高效的方法,但 ...
随机推荐
- 1117 Eddington Number (25 分)
1117 Eddington Number (25 分) British astronomer Eddington liked to ride a bike. It is said that in o ...
- 与PHP5.3.5的战斗----记php5.3.5安装过程
与PHP5.3.5的战斗----记php5.3.5安装过程 摘自:http://blog.csdn.net/lgg201/article/details/6125189这篇文章写的很是不错,,,也是我 ...
- Spark学习笔记2:RDD编程
通过一个简单的单词计数的例子来开始介绍RDD编程. import org.apache.spark.{SparkConf, SparkContext} object word { def main(a ...
- pig概述
pig概述pig是一个用于并行计算的高级数据流语言和执行框架:类sql.文件处理框架:有一套和sql类似的执行语句,处理的对象是HDFS上文件.Pig的数据处理语言是数据流方式的,一步一步的进行处理: ...
- MapReduce On YARN
MapReduce计算框架 将计算过程分为两个阶段:Map和Reduce Map阶段并行处理输入数据: Reduce阶段对Map结果进行汇总 Shuffle连接Map和Reduce两个阶段 Map T ...
- MySQL数据库Innodb储存引擎----储存页的结构
上一篇博客回顾: 1:数据库拥有众多的储存引擎,现在主要使用的是Inoodb,这个储存引擎有Compact,Redundant,Dynamic,Compressed四种行格式 2:Compact行格式 ...
- 一种思路,隐藏input标签,通过label关联
<label class="btn btn-default btn-file">上传图片 <input hidden type="file" ...
- tornado-模板,转义,上传静态文件
class MainHandler(tornado.web.RequestHandler): def get(self): self.render("ces.html") def ...
- 机器学习入门-概率阈值的逻辑回归对准确度和召回率的影响 lr.predict_proba(获得预测样本的概率值)
1.lr.predict_proba(under_text_x) 获得的是正负的概率值 在sklearn逻辑回归的计算过程中,使用的是大于0.5的是正值,小于0.5的是负值,我们使用使用不同的概率结 ...
- tensorflow笔记之反向传播时用到的几种方法
1. 梯度下降, tf.train.GradientDescentOptimizer(0.05),梯度下降的问题在与不一定能获得全局最优解,并且因为要在所有数据上最小化损失,所以损失函数是在所有训练数 ...