[题解]Mail.Ru Cup 2018 Round 1 - D. Changing Array
【题目】
【描述】
给n个整数a[1],...,a[n],满足0<=a[i]<=2^k-1。Vanya可以对这n个数中任一多个数进行操作,即将x变为x',其中x'指x限制在k位内二进制取反。问a[1],...,a[n]中最多有多少个连续子段的异或和不为0。
数据范围:1<=n<=200000,1<=k<=30
【思路】
为了叙述方便,记MAX=(1<<k)-1,即二进制下k位全是1的数。
为了符号表示不产生歧义,以下使用^表示异或(上面的题目描述中指的是次方)。
这里要用到异或运算的一个很重要的性质,即x^x=0。
根据定义,x^x'=MAX,从而x'=x^x^x'=x^MAX。
先不考虑a[1],...,a[n]的变化。维护前缀异或和s[i],于是a[i]^...^a[j]=s[j]^s[i-1]。那么,a[i]^...^a[j]==0当且仅当s[j]==s[i-1]。为了让连续子段异或和为0尽量少,就是要让s[i]尽量不同。
再看改变某个a[i]会带来的影响。将某个a[i]变为a[i]^MAX,那么包含a[i]的前缀异或和s[j]都要变为s[j]^MAX,即s[j]变为s[j]^MAX对所有j>=i。这个时候发现,如果再改变a[i+1],则s[k]又都变回去了对所有k>=i+1。这说明可以通过改变某些a[i]实现将某一个s[j]变为s[j]^MAX。
这个时候有个很自然的想法就是,值为x和x^MAX的那些s[i]应该放在一类中考虑,因为它们最多只有两个值,要想使得“在其中挑两个数,它们不相等”的概率最小,只能让取x和x^MAX的数字个数尽量平均,即相等或者相差1。
确定s[i]的取值之后(有多少个s[i]取某个值x或者x^MAX),记第k个取值的s[i]共有nk个,于是最终的答案为
。
注意:要注意取值范围,要开long long!【比赛中第一次提交就因为这个问题WA了……
【我的实现】
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6
7 using namespace std;
8 #define MaxN 200030
9
10 long long s[MaxN];
11
12 int main()
13 {
14 long long n, k;
15 long long i, j;
16 long long cnt, ans, tmp;
17 long long x;
18 long long MAX;
19 //scanf("%d%d", &n, &k);
20 cin >> n >> k;
21 MAX = (1<<(long long)k)-1;
22 s[0] = 0;
23 for(i = 1; i <= n; i++)
24 {
25 cin >> x;
26 s[i] = s[i-1] ^ x;
27 }
28 for(i = 0; i <= n; i++)
29 s[i] = min(s[i], MAX^s[i]);
30 sort(s, s+n+1);
31 cnt = 0;
32 ans = (n+1) * n / 2;
33 for(i = 0; i <= n; i++)
34 {
35 if(i == 0 || s[i] == s[i-1])
36 cnt++;
37 else
38 {
39 if(cnt % 2) //奇数
40 {
41 tmp = cnt / 2;
42 ans -= tmp * (tmp-1) / 2;
43 tmp = cnt / 2 + 1;
44 ans -= tmp * (tmp-1) / 2;
45 }
46 else
47 {
48 tmp = cnt / 2;
49 ans -= tmp * (tmp-1);
50 }
51 cnt = 1;
52 }
53 }
54 if(cnt % 2) //奇数
55 {
56 tmp = cnt / 2;
57 ans -= tmp * (tmp-1) / 2;
58 tmp = cnt / 2 + 1;
59 ans -= tmp * (tmp-1) / 2;
60 }
61 else
62 {
63 tmp = cnt / 2;
64 ans -= tmp * (tmp-1);
65 }
66 cout<< ans;
67 return 0;
68 }
【评测结果】

[题解]Mail.Ru Cup 2018 Round 1 - D. Changing Array的更多相关文章
- [题解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution
[题目] C. Candies Distribution [描述] n个小朋友排排坐吃糖糖,小朋友从左到右编号1到n.每个小朋友手上有一定数量的糖.对于第i个小朋友来说,编号比他小的小朋友中有li个小 ...
- [题解]Mail.Ru Cup 2018 Round 1 - B. Appending Mex
[题目] B. Appending Mex [描述] Ildar定义了一种方法,可以由一个数组产生一个数.具体地,从这个数组中任选一个子集,不在这个子集中的最小的非负整数称为mex,就是由这个数组得到 ...
- [题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?
[题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升 ...
- [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]
https://codeforces.com/contest/1056/problem/B 题意:输入n,m 求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...
- 【Mail.Ru Cup 2018 Round 2 A】 Metro
[链接] 我是链接,点我呀:) [题意] [题解] 1:一直往右走的情况. 2:中间某个地方中转 (不会出现超过1次的转弯. (如果超过了和1次是等价的 [代码] #include <bits/ ...
- 【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser
[链接] 我是链接,点我呀:) [题意] [题解] 因为只会增加. 所以. 一开始暴力算出来初始答案 每次改变一个点的话. 就只需要看看和他相邻的数字的值就好. 看看他们是不是大于l 分情况增加.减少 ...
- 【Mail.Ru Cup 2018 Round 2 C】 Lucky Days
[链接] 我是链接,点我呀:) [题意] [题解] 题解的作者: manish_joshi 对于任意一个k 因为那条直线(关于x,y的方程可以看出一条直线)的斜率>= 所以肯定会经过第一象限. ...
- Mail.Ru Cup 2018 Round 2 C. Lucky Days(拓展欧几里得)
传送门 待参考资料: [1]:https://www.cnblogs.com/Patt/p/9941200.html •题意 a君,b君存在幸运周期: a君在第[ L1+k·t1,R1+k·t1]天为 ...
- Mail.Ru Cup 2018 Round 3 B. Divide Candies
题目链接 分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,ji,ji,j的方案数; 即(i2+j2)mod   m=0 (n ≤ ...
随机推荐
- 【机器学习】HMM
机器学习算法-HMM 目录 机器学习算法-HMM 1. 模型定义 2. 序列生成 3. 概率计算 3.1 前向计算 3.2 后向计算 4. 学习 4.1 求解 4.2 求解 4.3 求解 5. 预测 ...
- 一份尽可能全面的Go channel介绍
写在前面 针对目前网络上Go channel知识点较为分散(很难有单独的一份资料把所有知识点都囊括进来)的情况,在下斗胆站在巨人的肩膀上,总结了前辈的工作,并加入了自己的理解,形成了这篇文章.本文类似 ...
- Android开发----使用 Room 将数据保存到本地数据库
Room介绍以及不使用SQLite的原因 Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库. 处理大量结构化数据的应用可极大地受益于 ...
- 强化学习实战 | 自定义Gym环境之扫雷
开始之前 先考虑几个问题: Q1:如何展开无雷区? Q2:如何计算格子的提示数? Q3:如何表示扫雷游戏的状态? A1:可以使用递归函数,或是堆栈. A2:一般的做法是,需要打开某格子时,再去统计周围 ...
- 计算机网络再次整理————tcp[二]
前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...
- Linux 配置 dubbo 和 dubbo的简单介绍。
一.是么是 dubbo? 一.dubbo? 1.因为项目之间需要相互调用,达到某种预期的结果 1.1 restful? 门户网站必须要知道用户的登录状态,但是用户的登录状态在登录项目中,所以门户网站 ...
- 记一次.net core 异步线程设置超时时间
前言: 刷帖子看到一篇 Go 记录一次groutine通信与context控制 看了一下需求背景,挺有意思的,琢磨了下.net core下的实现 需求背景: 项目中需要定期执行任务A来做一些辅助的工作 ...
- go 把固定长度的数字写入字节切片 (byte slice),然后从字节切片中读取到并赋值给一个变量:
// write v := uint32(500) buf := make([]byte, 4) binary.BigEndian.PutUint32(buf, v) // read x := bin ...
- art 模式 android runtime
空间换时间的概念. art:程序在安装时需要预编译读取,将代码转换为机器码 好处:程序运行时,无需时时转换,运行速度快 : 缺点:安装时间稍长,由于转换机器码,所以占用略高的存储空间.
- Jquery--1--选择器分类
基本选择器 $("#id") //ID选择器 $("div") //标签选择器 $(".classname ...