传送门

考试的时候卡了一会儿。

显然这个答案只跟二进制位为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. leetcode127

    class Solution { public int ladderLength(String beginWord, String endWord, List<String> wordLi ...

  2. 1.HTML编码解码URL替换--代码整理

    public class HtmlCode { public static String encode(String str){ String s = ""; if (str.le ...

  3. gulp css 压缩 合并

    //导入工具包 require('node_modules里对应模块') var gulp = require('gulp'), //本地安装gulp所用到的地方 concat = require(' ...

  4. REST 服务器调试 RESTDebugger.exe 和浏览器测试

    开发一个简单的rest服务器, 增加了一些函数,比如返回系统当前时间 如何验证是否正确呢,不需要自己编写客户端调用程序了, 可以直接使用RESTDebugger.exe D:\Program File ...

  5. mysql使用一条sql删除多条数据

    使用in delete from course where chour in(55,56,57); course:表名 chour:字段 55,56,57数据

  6. node 的exports 和module

    文件05/** * Created by Mr.tiankong on 2017/3/24. */var People = require("./test/people.js"); ...

  7. dmidecode详解

    1.DMI简介 DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行. SMBI ...

  8. Haskell语言学习笔记(42)Bifunctor

    Bifunctor class Bifunctor p where bimap :: (a -> b) -> (c -> d) -> p a c -> p b d bim ...

  9. 处理【由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面】

    处理[由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] 详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 ...

  10. 大型运输行业实战_day04_3_高级查询+分页

    1.高级查询+分页最终结果 2.分页的本质分析 前端传入:当前页  和  每页显示条数 数据库必须查询出:数据列表 和 总共条数 页面显示包括的数据有: 列表 +  每页显示条数 + 当前页 + 总共 ...