codeforces|CF1054D Changing Array
因为数据范围是2e5级别的,所以我们考虑用异或前缀和来处理区间的异或情况。(比如说a包括b,那么我们通过异或可以知道b对于a的补区间的信息)
之后因为对任意\(a_i\)进行取反操作,会改变它和它之后的区间值(原来相等的都不相等了,原来不相等的都相等了),所以结果是我们对原先的前缀和直接取反,就可以表示对它进行取反操作之后的前缀和了。
因为不管怎么取反操作,一个位置的前缀和只有两种,那么我们显然就可以预处理出所有的值了。
然后我们可以把相同类别的放在一个map里面。(注意要避免重复,比如说010和101是一类)
之后把ans值\((==n*(n+1)/2)\)减去重复的就可以了。
因为是要求区间异或和不为0,那么转化下来的条件就是前缀和选取的两个不相等即可。
我们要求最大的个数,那么就是同一类的最好均分,用组合数算就行了。(比如说有5个010的话,分成2个010和3个101就行了)
最后注意一下要先给0类加一。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define MAXN 200010
using namespace std;
long long ans;
int pre[MAXN];
map<int,int>m;
int n,k,x;
int main() {
scanf("%d%d",&n,&k);
m[0]++;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
pre[i]=pre[i-1]^x;
pre[i]=min(pre[i],pre[i]^((1<<k)-1));
m[pre[i]]++;
}
ans=(long long)(n+1)*n/2;
for (map<int,int>::iterator it=m.begin();it!=m.end();it++)
{
long long x=it->second;
ans-=(long long)((x/2)-1)*(x/2)/2;
ans-=(long long)((x-x/2)-1)*(x-x/2)/2;
}
printf("%lld\n",ans);
}
codeforces|CF1054D Changing Array的更多相关文章
- Codeforces 1054D Changing Array 贪心+异或和
题意 给一个长度为\(n\)的位数为\(k\)的整数数列\(a\),一次操作可将任意\(a_i\)取反,问经过任意次操作后最多有多少个区间异或和不为\(0\) 分析 求出前缀异或和,区间异或和为\(0 ...
- Codeforces 482B Interesting Array(线段树)
题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...
- Codeforces 1077C Good Array 坑 C
Codeforces 1077C Good Array https://vjudge.net/problem/CodeForces-1077C 题目: Let's call an array good ...
- codeforces 482B. Interesting Array【线段树区间更新】
题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数 ...
- codeforces 407C Curious Array
codeforces 407C Curious Array UPD: 我觉得这个做法比较好理解啊 参考题解:https://www.cnblogs.com/ChopsticksAN/p/4908377 ...
- codeforces 797 E. Array Queries【dp,暴力】
题目链接:codeforces 797 E. Array Queries 题意:给你一个长度为n的数组a,和q个询问,每次询问为(p,k),相应的把p转换为p+a[p]+k,直到p > n为 ...
- [题解]Mail.Ru Cup 2018 Round 1 - D. Changing Array
[题目] D. Changing Array [描述] 给n个整数a[1],...,a[n],满足0<=a[i]<=2^k-1.Vanya可以对这n个数中任一多个数进行操作,即将x变为x' ...
- 【CodeForces 624D】Array GCD
题 You are given array ai of length n. You may consecutively apply two operations to this array: remo ...
- codeforces 86D : Powerful array
Description An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary su ...
随机推荐
- 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以
热更新是什么?简单的说就是打补丁,只补需要部分,不用重个游戏包重打上传 热更新问题的本质是代码更新而不是资源更新,为什么呢? 大型手游都是将补丁资源放在专门的WEB服务器上,游戏启动时动态下载并放入到 ...
- ES6中新添加的Array.prototype.fill
用法 array.fill(start=0, end=this.length) 示例 [1, 2, 3].fill(4) // [4, 4, 4] [1, 2, 3].fill(4, 1) // [1 ...
- (转) iphone开发资源汇总
如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://g ...
- C#获取类里面的所有的方法名称
Type trypInfo = typeof(Program);// Program为类名//获得方法名string str = "包括的方法名列表:\r\n"; MethodIn ...
- Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。
Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...
- ubuntu Qt5 librealsense opencv
08:11:47: 进程"/usr/bin/make"正常退出. 08:11:47: 配置没有改变, 跳过 qmake 步骤. 08:11:47: 正在启动 "/usr/ ...
- Java 8特性
1. Java8的新特性 1.1. Lambda表达式和函数式接口 最简单的Lambda表达式可以用逗号分隔的参数列表.->符号和功能语句块来表示.示例如下: Arrays.asList( &q ...
- OpenGL坐标变换专题
OpenGL坐标变换专题(转) OpenGL通过相机模拟.可以实现计算机图形学中最基本的三维变换,即几何变换.投影变换.裁剪变换.视口变换等,同时,OpenGL还实现了矩阵堆栈等.理解掌握了有关坐 ...
- Spring Boot☞ 多数据源配置(二):Spring-data-jpa
效果图: 代码区: package com.wls.integrateplugs.datasource; import org.springframework.beans.factory.annota ...
- OSG相机与视图
转自:http://blog.csdn.net/wang15061955806/article/details/51603083 相机与视图 osg::Camera类用来管理OSG中的模型—— ...