【无标题】+

区间or划分 - 蓝桥云课 (lanqiao.cn)

#include <bits/stdc++.h>
using namespace std;
using PII = pair<int,int >;
using ll  = long long;
using namespace std;
int n,m;

int a[200010];
int sum[200010];
int t;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum[i] = sum[i-1] | a[i];
    }
    cout<<sum[n]<<" ";
    int s = 0;
    int ct = 0;
    


   for(int i=n;i>=1;i--){
       s |= a[i];
       if((s + sum[i-1]) == sum[n])ct++;
   }

    cout<<ct;

}

抄了一下别人的做法,就是找到 | 的节点 可以替换为 + 的位置

维护一个前缀或   从尾巴开始遍历维护一个后缀或

当这个后缀或 + sum[i-1] == s[n]  即如果从这个位置划分不会影响结果

——————————————————————————————

关于我自己的做法,一时半会没想明白哪错

就是 | 和 +   当 a & b == 0  时 ,两者的操作时等效的,

那么从头开始统计,如果 s & a[i] == 0  那么代表a[i] 可以和 s 并在一起 此时 s |= a[i]

或者s += a[i]  此时操作一样,那么就考虑把 a[i] 划出当前区间,

但这有点问题,待我想想

蠢了

a | b | c 变成了 a + b + c 

如果bc放在一起 那么就变  a + (b | c) 当时 b | c 不一定和a 满足刚刚那个操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值