区间或,区间与,区间最大值

题意如题,数据大概在: n , m &lt; = 1 0 4 , 0 &lt; = x &lt; = 1 0 9 n,m&lt;=10^4,0&lt;=x&lt;=10^9 n,m<=104,0<=x<=109
将一个数字拆成二进制的样子,那么与,或运算对每一位都做一次,那么就转化成了区间加减法。
如果一个子区间全1或全0就可以回溯了,否则继续递归下去暴力改数字。

没找到原题,写了一份对拍的代码,可以造点数据对拍一下。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxn=1e5+7;

ll maxx[maxn<<2|1];
ll lazy[maxn<<2|1];
int is[maxn<<2|1][39];

int is01[maxn<<2|1][39];

void pushup(int k){
   
    maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
    for(int i=0;i<=30;++i){
   
        if(is01[k<<1][i]==is01[k<<1|1][i]) is01[k][i]=is01[k<<1][i];
        else is01[k][i]=2;
    }
}

void pushup2(int k,int pos){
   
    maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
    if(is01[k<<1][pos]==is01[k<<1|1][pos]) is01[k][pos]=is01[k<<1][pos];
    else is01[k][pos]=2;
}
void build(int l,int r,int k){<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值