[CF1030E]Vasya and Good Sequences
[CF1030E]Vasya and Good Sequences
题目大意:
给定一个长度为\(n(n\le3\times10^5)\)的数列\(a_i(1\le a_i\le10^{18})\)。可以任意对若干数进行操作,交换这个数的任意二进制位。求有多少区间,使得这个区间内的数经过操作使得异或和为\(0\)。
思路:
显然这与\(a_i\)本身的值无关,只与二进制下\(1\)的个数有关。
一个区间\([l,r]\)需要满足以下条件:
- 二进制下\(1\)的个数为偶数;
- 二进制下\(1\)的个数最多的那个数的\(1\)的个数不超过剩下的数。
对于条件\(1\),我们可以很自然地得到一个\(\mathcal O(n)\)的做法。
对于条件\(2\),由于对于每个数,\(1\)的个数至少是\(1\),最多不超过\(60\),所以只需要枚举\(60\)个即可。
时间复杂度\(\mathcal O(60n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long int64;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=3e5+1;
int c[N],sum[N],cnt[2]={1};
int main() {
const int n=getint();
int64 ans=0;
for(register int i=1;i<=n;i++) {
c[i]=__builtin_popcountll(getint());
sum[i]=sum[i-1]+c[i];
ans+=cnt[sum[i]&1];
for(register int j=i,k=i+1,max=0;j>=1&&j>=i-61;j--) {
while(k>j) max=std::max(max,c[--k]);
if(max*2>sum[i]-sum[j-1]&&(sum[i]%2==sum[j-1]%2)) ans--;
}
cnt[sum[i]%2]++;
}
printf("%lld\n",ans);
return 0;
}
[CF1030E]Vasya and Good Sequences的更多相关文章
- Codeforces 1053 B - Vasya and Good Sequences
B - Vasya and Good Sequences 思路: 满足异或值为0的区间,必须满足一下条件: 1.区间中二进制1的个数和为偶数个; 2.区间二进制1的个数最大值的两倍不超过区间和. 如果 ...
- codeforces 1041 E.Vasya and Good Sequences(暴力?)
E. Vasya and Good Sequences time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Codeforces Round #512 E - Vasya and Good Sequences
有时候觉得自己就是个思路搬运机,只会搬运思路 这个题首先说了求的是好区间的个数, 好区间满足条件: 1.二进制位1的数量和为偶数 2.w[i]表示a[i]的二进制上1的个数 ,sum[i] = ...
- 2018.09.23 codeforces 1053B. Vasya and Good Sequences(前缀和)
传送门 考试的时候卡了一会儿. 显然这个答案只跟二进制位为1的数量有关. 还有一个显然的结论. 对于一个区间[l,r][l,r][l,r],如果其中单个数二进制位为1的数量最大值不到区间所有数二进制位 ...
- [Codeforces 1053B] Vasya and Good Sequences
Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...
- Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequences
题目链接 官网题解写的好清楚,和昨晚Aguin说的一模一样…… 这题只和每个数1的个数有关,设每个数1的个数的数组为$b$,就是首先一段如果是好的,要满足两个条件: 1.这一段$b$数组和为偶数,因为 ...
- [Codeforces 1058E] Vasya and Good Sequences
[题目链接] https://codeforces.com/contest/1058/problem/E [算法] 显然 , 我们只需考虑序列中每个数的二进制表示下1的个数即可. 不妨令Ai表示第i个 ...
- Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequences(DP)
题目链接:http://codeforces.com/contest/1058/problem/E 题意:给出 n 个数,对于一个选定的区间,区间内的数可以通过重新排列二进制数的位置得到一个新的数,问 ...
- Technocup 2019 - Elimination Round 1
http://codeforces.com/contest/1030 B. Vasya and Cornfield 判断点是否在矩形内(包括边界) 把每条边转化为一个不等式 public static ...
随机推荐
- Mean shift
转载:http://blog.csdn.net/google19890102/article/details/51030884 然后引入opencv中的pyrMeanShiftFiltering函数: ...
- springboot系列十三、springboot集成swaggerUI
一.Swagger介绍 Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. ...
- Visual Studio 2017中的快捷键
Ctrl+Tab: 快速切换活动文件
- 微服务(Microservices )简介
概念 微服务架构风格是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在自己的进程中运行, 并与轻量级机制(通常是HTTP资源API)进行通信. 这些服务是围绕业务功能构建的,可以通过全自 ...
- css之hover改变子元素和其他元素样式
参考地址:链接 +表示下一级元素,>表示子元素 <!DOCTYPE html> <html> <head lang="en"> <m ...
- hdu3530 双单调队列的维护
单调队列有部分堆的功能,但其只能维护给定区间中比v大的值或者比v小的值,且其一般存储元素的下标. 思路:两个单调队列维护最大值与最小值的下标,如果区间的最大值最小值之差大于给定范围,则选择队首靠左的删 ...
- docker 运行Django项目
一.概述 已经写好了一个Django项目,需要将这个项目用docker封装一个镜像,使用k8s发布! 在封装并运行的过程中,发现了很多问题,这里会一一介绍! 二.时区问题 采用的是镜像是 ubuntu ...
- java select 多字段处理查询结果辅助类
接口 ResultSetMetaData 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象 使用示例: ResultSet rs = stmt.executeQuery(" ...
- ERP合同管理二(三十)
未审核表单列表显示: 1.用户登录后,根据登录用户加载审核流程表中属于当前登录用户的未审核表单.2.点击选中未审核表单跳转到指定审核流程页面 if (Request.QueryString[" ...
- (第2篇)一篇文章教你轻松安装hadoop
摘要: 这篇文章将会手把手教你安装hadoop,只要你细心按照文章中的步骤操作,hadoop肯定能正确安装,绝对不会让你崩溃 博主福利 给大家赠送一套hadoop视频课程 授课老师是百度 hadoop ...