@description@

给出 N 个数,每次操作可以任意选择两个数,将其中一个替换为两个数的异或。

求任意次操作后,最终所有数的和的最大值。

Class:

XorAndSum

Method:

maxSum

Parameters:

long[]

Returns:

long

sample:

{1,2,3}

Returns: 8

constraints

数的数量 N <= 50,保证所有数的权值 <= 10^15。

@solution@

最大、异或这些关键字,不难想到线性基。

同时可以发现,题目中给出的操作颇有些像高斯消元中,将一个方程异或到另一个方程的操作。

这更坚定了我们写线性基的决心。

我们可以类比高斯消元的做法,将线性基外的数全部消成 0,然后再通过线性基异或成可以异或得到的最大值。

考虑线性基中的数怎么才能取到最大值。

我们将线性基继续类比高斯消元进行简化,将每一行的主元(如果有)所在列全部异或成 0。

然后?可以发现一个大小为 k 的线性基可以异或出 2^k 种数,而我们一共有 k 个主元,决定每一个主元是选还不是选的方案数也是 2^k。进而两者是一一对应的。

我们希望最终线性基中的每一个数都是最大值:即选择所有的主元的那种方案。但是我们可以发现,根据线性基的定义可以简单反证假如有两个以上的主元在自己所在列的每一行中都为 1,会导致矛盾。

这意味着对于主元所在的列,必然存在一个 0,只有一列会例外。显然我们将这个例外放在最大的主元是最优的。

于是线性基中最大和就可以构造出来了:有一个数是选择所有主元(即能异或出的最大值),其他数总是缺一个主元。

我也不知道我上面写了啥。大家也可以看看yhn学长的博客。

@accepted code@

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
class XorAndSum{
public:
ll b[60 + 5];
void insert(ll x) {
for(int i=60;i>=0;i--)
if( x & (1LL<<i) ) {
if( b[i] == 0 )
b[i] = x;
x ^= b[i];
}
}
ll get_max() {
for(int i=60;i>=0;i--)
for(int j=i-1;j>=0;j--)
if( b[i] & (1LL<<j) )
b[i] ^= b[j];
ll ret = 0;
for(int i=60;i>=0;i--)
ret ^= b[i];
return ret;
}
ll maxSum(vector<ll>v) {
for(int i=0;i<v.size();i++)
insert(v[i]);
ll x = get_max(), ans = v.size()*x;
bool fir = true;
for(int i=60;i>=0;i--)
if( b[i] ) {
if( fir )
fir = false;
else
ans = ans - x + (x^b[i]);
}
return ans;
}
};

@details@

老师:这个不是线性基的入门题?你考试的时候连这个都写不起?

我:……

怎么办整个世界都在嘲讽我。。。

@topcoder - SRM577D1L3@ XorAndSum的更多相关文章

  1. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  2. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  3. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  4. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  5. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  6. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  7. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  8. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  9. Topcoder Arena插件配置和训练指南

    一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...

随机推荐

  1. leetcode 76 dp& 强连通分量&并查集经典操作

    800. Similar RGB Color class Solution { int getn(int k){ return (k+8)/17; } string strd(int k){ char ...

  2. UvaLive1347

    Programming contests became so popular in the year 2397 that the governor of New Earck — the largest ...

  3. javascript DOM知识脑图

  4. git update-index --assume-unchanged忽略跟踪

    Git 忽略已跟踪文件的改动 git update-index --assume-unchanged Git之本地忽略 这个分两种情况: 本地永久忽略,效果的gitignore一样,只不过不适于写到g ...

  5. 会话技术之Session(购物车加入、查看和清空)

    会话技术之Session session:服务器端会话技术 当我们第一次访问的服务器的时候,服务器获取id, 能获取id 要拿着这个id去服务器中查找有无此session 若查找到了:直接拿过来将数据 ...

  6. SDUT-3403_数据结构实验之排序六:希尔排序

    数据结构实验之排序六:希尔排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 我们已经学习了各种排序方法,知道在不同的 ...

  7. js将canvas保存成图片并下载

    <canvas id="canvas" width="400" height="400"></canvas> < ...

  8. Python发送邮件1(带附件的)

    普通的发邮件(不使用类)

  9. 洛谷P2522 [HAOI2011]Problem b (莫比乌斯反演+容斥)

    题意:求$\sum_{i=a}^{b}\sum_{j=c}^{d}[gcd(i,j)==k]$(1<=a,b,c,d,k<=50000). 是洛谷P3455 [POI2007]ZAP-Qu ...

  10. CSDN编程挑战——《-3+1》

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/user_longling/article/details/24674033 -3+1 题目详情: 有 ...