原题链接

题意

  • 目前我们有一个长为n的序列,我们可以对其中的每一个数进行任意的二进制重排(改变其二进制表示结果的排列),问我们进行若干次操作后得到的序列,最多能有多少对 \(l, r\) 使得 \([l, r]\)区间内的异或和为0。

思路

  • 首先注意到“二进制重排”,实际上也就是说,\(a_i\)是多少不重要,有用的信息是它本身有多少个1。

  • 然后,\([L, r]\)内异或和为0,可以认为是这个区间内的1能够相互抵消。那么这个区间内1的个数一定是偶数个。

  • 我们考虑1的个数为偶数个的情况下,如何才会出现不能相互抵消的情况。这种“特殊情况”其实就是存在一个数,它的1的数量比其他的数加起来都多。除了这种情况外,其他情况下都可以全部抵消。

  • 那么我们可以预处理出 \(pre[i]\),代表\(1 - i\)中有多少个1,然后从头开始扫描,同时记录两个变量,一是\(1 - i - 1\)中有多少个\(pre[j]\)为奇数,二是多少个为偶数。然后我们在\(i\)处时,给答案加上代表与\(pre[i]\)相同奇偶性的变量即可。

  • 在扫描的同时,我们需要减去答案中的所有符合“特殊情况”的\([l, i]\)区间数量。但是我们并不需要从1开始枚举,因为每个二进制数最多不超过63个1,所以事实上我们的枚举范围为\([i - 63, i]\)即可,剩下的长度大于63的区间一定不会符合“特殊情况”。

AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map> using namespace std; const int N = 300000; long long abss(long long a)
{
if (a < 0)
{
a = -a;
}
return a;
} long long n;
long long xx;
long long aa[N + 5] = {0}, su[N + 5];
long long mm[105] = {0}; int main()
{
mm[0] = 1;
scanf("%lld", &n);
long long ans = 0;
su[0] = 0;
for (int i = 1; i <= n; ++i)
{
scanf("%lld", &xx);
while (xx)
{
if (xx & 1)
{
++aa[i];
}
xx >>= 1;
}
su[i] = su[i - 1] + aa[i];
}
long long l[2] = {1, 0};
aa[0] = 0;
for (int i = 1; i <= n; ++i)
{
int bitt = su[i] & 1;
ans += l[bitt];
long long mx = aa[i];
long long rem = 0;
for (int j = i - 1; j >= 0 && j >= i - 63; --j)
{
if ((su[i] - su[j]) % 2 == 0 && rem < mx)
{
--ans;
}
if (mx < aa[j])
{
rem += mx;
mx = aa[j];
}
else
{
rem += aa[j];;
}
}
++l[bitt];;
}
printf("%lld", ans);;
return 0;
}

CodeForces 1030E Vasya and Good Sequences 位运算 思维的更多相关文章

  1. codeforces 245 D. Restoring Table(位运算+思维)

    题目链接:http://codeforces.com/contest/245/problem/D 题意:给出一个矩阵b,b[i][j]=a[i]&a[j],b[i][i]=-1.然后求a[i] ...

  2. Codeforces Round #716 (Div. 2), problem: (B) AND 0, Sum Big位运算思维

    & -- 位运算之一,有0则0 原题链接 Problem - 1514B - Codeforces 题目 Example input 2 2 2 100000 20 output 4 2267 ...

  3. Codeforces Round #443 (Div. 2) C 位运算

    C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. Codeforces F. Bits And Pieces(位运算)

    传送门. 位运算的比较基本的题. 考虑枚举\(i\),然后二进制位从大到小考虑, 对于第\(w\)位,如果\(a[i][w]=1\),那么对\(j.k\)并没有什么限制. 如果\(a[i][w]=0\ ...

  5. 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)

    点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...

  6. Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推

    https://codeforces.com/contest/1330/problem/D 给出d,m, 找到一个a数组,满足以下要求: a数组的长度为n,n≥1; 1≤a1<a2<⋯&l ...

  7. Codeforces 734F Anton and School(位运算)

    [题目链接] http://codeforces.com/problemset/problem/734/F [题目大意] 给出数列b和数列c,求数列a,如果不存在则输出-1 [题解] 我们发现: bi ...

  8. CodeForces 558C Amr and Chemistry (位运算,数论,规律,枚举)

    Codeforces 558C 题意:给n个数字,对每一个数字能够进行两种操作:num*2与num/2(向下取整),求:让n个数相等最少须要操作多少次. 分析: 计算每一个数的二进制公共前缀. 枚举法 ...

  9. [Codeforces 1053B] Vasya and Good Sequences

    Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...

  10. [Codeforces 1058E] Vasya and Good Sequences

    [题目链接] https://codeforces.com/contest/1058/problem/E [算法] 显然 , 我们只需考虑序列中每个数的二进制表示下1的个数即可. 不妨令Ai表示第i个 ...

随机推荐

  1. Rust WebAssembly 绑定输入类型(基于 Serde)

    前言 单位有个项目要共享前后端检查策略后端用的正好也是 Rust,但是 Rust 默认的 wasm-bindgen 包中提供的转换操作非常少,像 Vec<T> <=> Arra ...

  2. Linux 中如何安全地抹去磁盘数据?

    哈喽大家好,我是咸鱼 离过职的小伙伴都知道,离职的时候需要上交公司电脑,但是电脑里面有许多我们的个人信息(聊天记录.浏览记录等等) 所以我们就需要先把这些信息都删除,确保无法恢复之后才上交 即有些情况 ...

  3. Apifox调用文件下载或Excel导出接口

    点发送下面这个发送并下载就行了,,,,,在网上搜了一下午愣是没看到,,,,,,

  4. day1 C语言:对于P1055 ISBN号码的代码优化及多解

    day1 C语言:对于P1055 ISBN号码的代码优化及多解 先看题目 直接说最优解,其他方法后置 第一部分 1.第一个点是数据的输入,本人第一的想法是直接用int类型去接受数据,但因为" ...

  5. P8816 [CSP-J 2022] 上升点列

    Problem 考察算法:\(DP\). 题目简述 给你 \(n\) 个点,每个点有一个坐标 \((x_i,y_i)\),还可以添加 \(k\) 个点. 添加之后,求:最长的上升点列的长度. 上升点列 ...

  6. c#组合模式详解

    基础介绍:   组合模式用于表示部分-整体的层次结构.适用于希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象的情况.   顾名思义,什么叫部分-整体,比如常见的前端UI,一个 ...

  7. reverse_re3

    main函数 点击重要函数 对if里面的数字按r键,使其从ASCII码转为字符 发现wasd四个关键的移动方向键,判断为迷宫问题 判断应该是要次数为2,即次数++3(从0开始计数)次才会有flag 点 ...

  8. 从GPT定制到Turbo升级再到Assistants API,未来AI世界,你准备好了吗?

    引言 在OpenAI DevDay发布会上,OpenAI再次震撼整个人工智能行业,为AI领域带来了重大的更新.CEO Sam Altman宣布推出了定制版本的ChatGPT,这意味着用户现在可以根据自 ...

  9. markdown语法基本使用

    markdown 语法基本使用 目录 markdown 语法基本使用 各级标题 字体 引用 分隔线 图片 列表 表格 代码 超链接 各级标题 井号加上空格,几级标题用几个井号加上空格 字体 单星号引起 ...

  10. 提升开发技能:10个高级的JavaScript技巧

    前言 在这个快速发展的数字时代,JavaScript作为一种广泛应用的编程语言,其重要性愈发凸显.为了在竞争激烈的开发领域中保持竞争力,不断提升自己的技能是至关重要的.本文小编将您介绍10个高级的Ja ...