噜啦噜啦噜呼呼呼 2024-04-09 23:00 采纳率: 70.7%
浏览 10

蓝桥杯异或和之和报错了

img

img

请问为什么会出现这样的问题呢,应该怎么改呢


/*
异或;如果1的个数是奇数个,则异或结果为1,否则为0
当一个区间内,这一位所对的1的个数是奇数时,这一位就产生了贡献;
当一个区间内,这一位所对的1的个数是偶数时,这一位就不产生贡献;
统计第i位所对的1的前缀和,如果到某个数字时,
所对前缀和是奇数,那么他就能够提供 (1+前面偶数的个数)个合法区间(即选取几个元素);
如果所对前缀和是偶数,那么他就能够提供 (前面奇数的个数)个合法区间
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
    int n;
    cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++)
        cin>>a[i];
    int ans=0; //贡献总值
    for(int i=19;i>=0;i--)  //遍历每一位
    {
        int s=0,n0=1,n1=0; 
        //s为前缀和,即在第i位上到某个元素为止1的总数
        //n0为各前缀和为偶数个的个数
        //n0=1是因为当所对前缀和为奇数时算合法区间时用到(1+前面偶数的个数)
        //n1为各前缀和为奇数个的个数(n0和n1相当于合法区间个数)
        for(int j=0;j<n;j++)  //遍历每一个元素
        {
            int bit=(a[j]>>i)&1; //可判断元素a[j]在第i位上是否为1
            s+=bit;
            if(!(s%2))  //奇数
            {
                ans+=(1<<i)*n0;
                n1++;
            }
            else
            {
                ans+=(1<<i)*n1;
                n0++;
            }
        }
    }
    cout<<ans<<std::endl;
}

int main()
{
    ios::sync_with_stdio(0);
    /*用于取消C++的输入/输出流与C的输入/输出函数(如printf和scanf)之间的同步。
    这样做通常可以加速输入/输出操作,特别是在使用C++的输入/输出流(如cin和cout)时。*/
    cin.tie(0);
    /*将cin与cout解绑。默认情况下,cin和cout是绑定的,这意味着每次从cin读取数据后,
    cout都会刷新其缓冲区。解绑它们可以提高输入/输出的效率。*/
    //cout.tie(0)
    solve();
    return 0;
}
  • 写回答

5条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-04-09 23:00
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述 给定一个长度为 $n$ 的序列 $a$ ,求有多少个区间满足区间内所有数的异或和为偶数。 思路分析 对于序列 $a$ 的任意一个区间 $[l,r]$ ,令 $x$ 表示该区间的异或和,则 $x$ 的值只有两种情况:奇数或偶数。
    • 当 $x$ 为偶数时,区间 $[l,r]$ 满足条件。
    • 当 $x$ 为奇数时,可以将区间 $[l,r]$ 分为若干个子区间,使得每个子区间的异或和都为偶数。因为 $0$ 的异或恒为 $0$,所以可以将区间 $[l,r]$ 划分为以下 3 种情况的子区间:
    • 以 $l$ 为起点的子区间 $[l,i]$ ,使得子区间 $[l,i-1]$ 的异或和为偶数,新加入的 $a_i$ 为 $0$ 时,子区间 $[l,i]$ 的异或和为偶数,否则为奇数。
    • 以 $l$ 为起点的子区间 $[l,i]$ ,使得子区间 $[l,i-1]$ 的异或和为奇数,新加入的 $a_i$ 为 $1$ 时,子区间 $[l,i]$ 的异或和为偶数,否则为奇数。
    • 不以 $l$ 为起点的子区间 $[i,j]$ ,使得子区间 $[l,i-1]$ 和 $[j,r]$ 的异或和都为偶数,则子区间 $[i,j]$ 的异或和为偶数。 具体实现时,可以使用前缀异或和的思想,对于任意一位 $i$ 来说,记录前缀中该位上 $1$ 的个数,并判断该前缀中 $1$ 的个数的奇偶性。若该前缀中 $1$ 的个数为偶数,则该前缀为偶前缀,可以向后延伸 $(1 + $ 前面偶前缀的个数 $)$ 个区间,统计对答案的贡献。若该前缀中 $1$ 的个数为奇数,则该前缀为奇前缀,可以向后延伸前面奇前缀的个数个区间,统计对答案的贡献。 代码实现
    评论

报告相同问题?

问题事件

  • 创建了问题 4月9日

悬赏问题

  • ¥15 怎样才能让鼠标沿着线条的中心线轨迹移动
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?