传送门

考试的时候卡了一会儿。

显然这个答案只跟二进制位为1的数量有关。

还有一个显然的结论。

对于一个区间[l,r][l,r][l,r],如果其中单个数二进制位为1的数量最大值不到区间所有数二进制位为1的数量之和的一半即maxn∗2≤summaxn*2\le summaxn∗2≤sum,并且sum是偶数那么这个区间是好的。

继续考虑,如果我们枚举左端点l和右端点r,那么当sum[r0]−sum[l−1]≥64sum[r_0]-sum[l-1]\ge 64sum[r0​]−sum[l−1]≥64之后,如果保持lll不变,r0≤r≤nr_0\le r\le nr0​≤r≤n时的答案可以直接通过前缀和预处理求出。

这样总时间复杂度是O(n∗64)O(n*64)O(n∗64)

代码:

#include<bits/stdc++.h>
#define N 300005
#define ll long long
using namespace std;
inline ll read(){
	ll ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n;
ll a[N],sum[N],sum1[N],sum2[N],ans=0;
inline ll lowbit(ll x){return x&-x;}
inline int calc(ll x){
	int ret=0;
	while(x)x-=lowbit(x),++ret;
	return ret;
}
int main(){
	n=read(),sum2[0]=1;
	for(int i=1;i<=n;++i)sum[i]=sum[i-1]+(a[i]=calc(read()));
	for(int i=1;i<=n;++i)sum1[i]=sum1[i-1]+(sum[i]&1);
	for(int i=1;i<=n;++i)sum2[i]=sum2[i-1]+((sum[i]&1)^1);
	for(int r=1;r<=n;++r){
		ll maxn=a[r];
		int low=max(1,r-64);
		for(int l=r;l>=low;--l){
			maxn=max(maxn,a[l]);
			if((maxn<<1)<=(sum[r]-sum[l-1])&&(sum[r]&1)==(sum[l-1]&1))++ans;
		}
		if(low==1)continue;
		ans+=sum[r]&1?sum1[low-2]:sum2[low-2];
	}
	cout<<ans;
	return 0;
}

2018.09.23 codeforces 1053B. Vasya and Good Sequences(前缀和)的更多相关文章

  1. [Codeforces 1053B] Vasya and Good Sequences

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

  2. 2018.09.23 codeforces 1053A. In Search of an Easy Problem(gcd)

    传送门 今天的签到题. 有一个很显然的结论,gcd(n∗m,k)≤2gcd(n*m,k)\le 2gcd(n∗m,k)≤2. 本蒟蒻是用的行列式求三角形面积证明的. 如果满足这个条件,就可以直接构造出 ...

  3. 2018.09.24 codeforces 1051F. The Shortest Statement(dijkstra+lca)

    传送门 这真是一道一言难尽的题. 首先比赛的时候居然没想出来正解. 其次赛后调试一直调不出来最后发现是depth传错了. 其实这是一道简单题啊. 对于树边直接lca求距离. 由于非树边最多21条. 因 ...

  4. 2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)

    传送门 就是让你维护动态的区间带权中位数. 然而昨晚比赛时并没有调出来. 想找到带权中位数的中点可以二分(也可以直接在线段树上找). 也就是二分出第一个断点,使得断点左边的和恰好大于或等于断点右边的和 ...

  5. 2018.09.23 atcoder Boxes and Candies(贪心)

    传送门 一道挺有意思的贪心. 从1到n依次满足条件. 注意要特判第一个数已经大于x的情况. 但是如何贪心吃呢? 如果靠左的数没有越界,我们吃靠右的数. 原因是下一次靠右的数就会成为靠左的数,相当于多贡 ...

  6. 2018.09.23 bzoj1076: [SCOI2008]奖励关(期望+状压dp)

    传送门 一道神奇的期望状压dp. 用f[i][j]f[i][j]f[i][j]表示目前在第i轮已选取物品状态为j,从现在到第k轮能得到的最大贡献. 如果我们从前向后推有可能会遇到不合法的情况. 所以我 ...

  7. 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)

    传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...

  8. 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)

    描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...

  9. 2018.09.23 关键网线(tarjan)

    描述 给出一个无向连通图,即在任一个点对间存在路径.有的点提供服务a, 有的点提供服务b .同一个点可能有两种服务类型.每个点必须与提供2种服务的点连通.如果一个边断掉,就可能出现有些点不能被服务到, ...

随机推荐

  1. FireFox 火狐主页被劫持

    火狐主页被劫持hao123,流氓 WIN7 ,firefox,任务栏,快速启动,右键 属性 target 应该是 "D:\Program Files (x86)\Mozilla Firefo ...

  2. Dictionary 字典的使用

    Dim a, d, i             '创建几个变量Set d = CreateObject("Scripting.Dictionary")d.Add "a&q ...

  3. 字符串(string) 的基本操作

    name = "my \tname is alex"  #\t 空格 1. name.capitalize()  #首字母大写 2.name.count('a') # 对字母a计数 ...

  4. Invalid args, too big block

    在调试vs程序的时候 查看log 会出现下面几行log: [9064] Error - [9064] Invalid args, too big block[9064] [9064] Error - ...

  5. __builtin__与__builtins__的区别与关系

    在学习Python时,很多人会问到__builtin__.__builtins__和builtins之间有什么关系.百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不 ...

  6. Why ExerciseAlone May Not Be the Key to Weight Loss

    加强运动也许并不能减肥Why ExerciseAlone May Not Be the Key to Weight LossIf you give a mouse a running wheel, i ...

  7. ArcGIS案例学习笔记3_2

    ArcGIS案例学习笔记3_2 联系方式:谢老师,135-4855-4328, xiexiaokui#qq.com 时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性, ...

  8. hbase orm中间层hbasedao

    博客园发布文章的体验太差,Markdown的支持巨烂无比,尝试了富文本编辑,太麻烦,遂作罢.想看的跳转到这两个连接吧 树莓派的奇幻漂流 github

  9. Python中文件编码的检测

    前言: 文件打开的原则是“ 以什么编码格式保存的,就以什么编码格式打开 ”,我们常见的文件一般是以“ utf-8 ”或“ GBK ”编码进行保存的,由于编辑器一般设置了默认的保存和打开方式,所以我们在 ...

  10. DESeq2包

    1)简介: DESeq2-package: for differential analysis of count data(对count data 做差异分析) 2)安装 if("DESeq ...