CodeForces 1030E Vasya and Good Sequences 位运算 思维
题意
- 目前我们有一个长为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 位运算 思维的更多相关文章
- 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] ...
- 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 ...
- Codeforces Round #443 (Div. 2) C 位运算
C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Codeforces F. Bits And Pieces(位运算)
传送门. 位运算的比较基本的题. 考虑枚举\(i\),然后二进制位从大到小考虑, 对于第\(w\)位,如果\(a[i][w]=1\),那么对\(j.k\)并没有什么限制. 如果\(a[i][w]=0\ ...
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- 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 ...
- Codeforces 734F Anton and School(位运算)
[题目链接] http://codeforces.com/problemset/problem/734/F [题目大意] 给出数列b和数列c,求数列a,如果不存在则输出-1 [题解] 我们发现: bi ...
- CodeForces 558C Amr and Chemistry (位运算,数论,规律,枚举)
Codeforces 558C 题意:给n个数字,对每一个数字能够进行两种操作:num*2与num/2(向下取整),求:让n个数相等最少须要操作多少次. 分析: 计算每一个数的二进制公共前缀. 枚举法 ...
- [Codeforces 1053B] Vasya and Good Sequences
Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...
- [Codeforces 1058E] Vasya and Good Sequences
[题目链接] https://codeforces.com/contest/1058/problem/E [算法] 显然 , 我们只需考虑序列中每个数的二进制表示下1的个数即可. 不妨令Ai表示第i个 ...
随机推荐
- 33家国内外知名的手机广告平台的SDK名单汇总,吐血推荐
下面格式:第一行是广告平台名称,第二行是SDK的包名特征,第三行是平台网站 多盟cn.domob.androidhttp://www.domob.cn/百度推广SDK com.baidu统计SDK c ...
- [NSSRound#1 Basic]basic_check
打开网站,发现啥也没有: 就用dirsearch扫了一遍.发现还是没有有用信息: 只有再另找方法: 再用nikto扫一次: 发现一个put方法,就用put上传一个一句话木马:可以用插件restlien ...
- OI-note
版权声明:仅供学习. 持续更新中...也算是个人学习的监督与激励吧. OI路漫漫,且行且珍惜. OI太颓了,模拟赛都打不动,班级全是大佬. 算法综合 \(Algorithm\) 杂题综合 Index ...
- 18.1 Socket 原生套接字抓包
原生套接字抓包的实现原理依赖于Windows系统中提供的ioctlsocket函数,该函数可将指定的网卡设置为混杂模式,网卡混杂模式(Promiscuous Mode)是常用于计算机网络抓包的一种模式 ...
- 从零开始编写一个 Python 异步 ASGI WEB 框架
从零开始编写一个 Python 异步 ASGI WEB 框架 前言 本着 「路漫漫其修远兮,吾将上下而求索」 的精神,这次要和朋友们分享的内容是<从零开始编写一个 Python 异步 ASGI ...
- 手撕Vuex-Vuex实现原理分析
本章节主要围绕着手撕 Vuex,那么在手撕之前,先来回顾一下 Vuex 的基本使用. 创建一个 Vuex 项目,我这里采用 vue-cli 创建一个项目,然后安装 Vuex. vue create v ...
- JVM-JVM如何加载类
一.Java 语言的类型可以分为两大类: 基本类型(primitive types) 引用类型(reference types):类.接口.数组类和泛型参数(泛型参数会在编译中被擦除),因此Java虚 ...
- 一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
前言 大家有使用过.NET开发过OCR工具吗?今天给大家推荐一个基于百度飞桨封装的.NET版本OCR工具类库:PaddleOCRSharp. OCR工具有什么用? OCR(Optical Charac ...
- Ubuntu 20.04 挂载局域网络共享硬盘
创建挂载目录 mkdir /media/nas 创建认证文件.若无密码可以忽略这一步. sudo vim /root/.examplecredentials 按照以下格式写入用户名密码: userna ...
- C语言输入一行字符,分别统计出其中英文字母、空格、数字与其它字符得个数。
#include<stdio.h> void main() { char c; int letter = 0, space = 0, digit = 0, other = 0; print ...