[codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]

http://codeforces.com/contest/1054/problem/D

题目大意:一个序列a1 a2...an,可以对若干个元素进行取反,使所得的新序列异或和为0的区间个数最多.

题目分析:首先易知每个位置的前缀异或和的值只有两种,因为对元素进行取反时,取偶数个元素异或和不变,奇数个元素就是原值取反.然后由于对一个位置取反,不会影响后面位置与这个位置的前缀异或和相同的位置个数(因为这个位置取反后,后面各个位置的前缀异或和也跟着改变),所以一个位置的改变只会影响与前面位置前缀和相同的个数,所以只需要贪心地根据前面位置值出现次数来进行是否取反该位置的判断.

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<map>
 5 #include<cstdio>
 6 using namespace std;
 7 typedef long long ll;
 8 ll q[200005];
 9 map<int ,int>nums;
10 int main(){
11     ll n,k;
12     cin>>n>>k;
13     for(int i=0;i<n;i++){
14         scanf("%lld",&q[i]);
15     }
16     ll s=(1<<k)-1;
17     ll res=q[0];
18     ll ans=(n+1)*n/2;
19     if(res==0){
20         res^=s;
21     }
22     nums[res]++;
23     for(int i=1;i<n;i++){
24         ll x1=res^q[i];
25         ll x2=x1^s;
26         if(x1==0){
27         if(nums[x1]+1>=nums[x2]){
28             res=res^q[i]^s;
29             ans-=nums[x2];
30             nums[x2]++;
31         }
32         else{
33             res=res^q[i];
34             ans=ans-nums[x1]-1;
35             nums[x1]++;
36         }
37         }
38         else if(x2==0){
39           if(nums[x1]>=nums[x2]+1){
40             res=res^q[i]^s;
41             ans=ans-nums[x2]-1;
42             nums[x2]++;
43         }
44         else{
45             res=res^q[i];
46             ans-=nums[x1];
47             nums[x1]++;
48         }
49
50         }
51        else if(nums[x1]>=nums[x2]){
52             res=res^q[i]^s;
53             ans-=nums[x2];
54             nums[x2]++;
55         }
56         else{
57             res=res^q[i];
58             ans-=nums[x1];
59             nums[x1]++;
60         }
61     }
62     cout<<ans<<endl;
63 }

原文地址:https://www.cnblogs.com/MekakuCityActor/p/9928410.html

时间: 2024-08-03 08:26:24

[codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]的相关文章

[题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?

[题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升电梯开门或者关门一次需要时间t3,当前直升电梯在第z层楼,直升电梯门是在关闭状态的.如果爬楼梯总时间严格小于坐直升电梯,则选择爬楼梯并输出YES,否则选择坐直升电梯并输出NO. 数据范围:1<=x,y,z,t1,t2,t3<=1000 [思路] 爬楼梯总时长:t1*abs(x-y) 坐直升电梯总时

Mail.Ru Cup 2018 Round 3 Solution

A. Determine Line Water. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n, vis[110]; 5 6 int main() 7 { 8 while (scanf("%d", &n) != EOF) 9 { 10 memset(vis, 0, sizeof vis); 11 for (int i = 1, tot, x; i <= n; ++i) 12 { 13 s

Mail.Ru Cup 2018 Round 1

A. Elevator or Stairs? 签. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int x, y, z, t[3]; 5 6 int main() 7 { 8 while (scanf("%d%d%d", &x, &y, &z) != EOF) 9 { 10 for (int i = 0; i < 3; ++i) scanf("%d", t +

Mail.Ru Cup 2018 Round 2 B. Alice and Hairdresser

传送门 待调bug https://paste.ubuntu.com/p/ZMzGkWMjkj/ 原文地址:https://www.cnblogs.com/violet-acmer/p/10916367.html

Codeforces Round #470 (rated, Div. 2, based on VK Cup 2018 Round 1)C. Producing Snow+差分标记

题目链接:C. Producing Snow 题意:给两个数组v[N],T[N],v[i]表示第i天造的雪,T[i],表示第i天的温度,一堆雪如果<=T[i],当天就会融完,否则融化T[i],要求输出每天的融雪总量. 题解:我对T数组求个前缀和,就可以二分找到每堆雪在那一天(pos)融化,余下的要加进答案中ans[i],然后用一个an数组在a[i]+1,a[pos]-1,最后求再求一次前缀和. ans[i]再加上an[i]*t[i].每次操作二分logn,N次操作.复杂度O(nlogn) #in

Codeforces Round #472 (rated, Div. 2, based on VK Cup 2018 Round 2)

A. Tritonic Iridescence 题解:分类讨论.注意题目要求,至少有两种方案. 1 #pragma warning(disable:4996) 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 9 int n, m; 10 stri

Codeforces Round #472 (based on VK Cup 2018 Round 2)解题报告

A. Mystical Mosaic 题目大意: 给一个空白矩阵,每次可以选一些行和一些列并让他们的交点涂黑,每次选的行和列不能有交集. 给出最后的矩阵样子,问能不能经过若干次以上操作后得到最后的矩阵. 思路: 每一行都可以确定哪些列必须被覆盖记为Si,任意两个不同的行之间要么S相等要么相交为空集. 所以我们要做的就是确定任意两行,他们的S要么相等要么相交为空集,这是答案为Yes的充要条件. 代码: 1 #include <bits/stdc++.h> 2 using namespace st

Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) C. Stairs and Elevators【二分查找】

In the year of 30XX30XX participants of some world programming championship live in a single large hotel. The hotel has nn floors. Each floor has mm sections with a single corridor connecting all of them. The sections are enumerated from 11 to mm alo

【枚举】【二分】【推导】Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) D. Resource Distribution

题意:有两个服务要求被满足,服务S1要求x1数量的资源,S2要求x2数量的资源.有n个服务器来提供资源,第i台能提供a[i]的资源.当你选择一定数量的服务器来为某个服务提供资源后,资源需求会等量地分担给它们,要求每台服务器承担的资源需求不超过其所能提供的资源需求.给定一种合法的方案,每台服务器要么没有被分配给任何一个服务,或者被分配给其中一个服务. 对服务器按能提供的资源从小到大排序.枚举给S1分配的服务器数量i,然后在a数组中二分,就可以得到给S1提供的是哪i台服务器,它们占据了a数组中连续的