基準時間限制:1 秒 空間限制:131072 kb 分值: 320
有乙個正整數陣列s,s中有n個元素,這些元素分別是s[0],s[1],s[2]...,s[n-1]。現在你可以通過乙個操作來更新陣列。操作方法如下:
選擇兩個不同的數i、j(0<=i,j
你可以進行任意多次操作,問最後生成的陣列s的元素和 sum = s[0]+s[1]+s[2]+...+s[n-1] 最大可能值是多少。輸出這個最大值。
例如:s = ,去a = s[1] xor s[0] = 1,b = s[0] = 1,新的s=,sum = 1+1 = 2.
input
第一行乙個整數n,且1<=n<=50output接下來n行每行乙個整數s[i],且0<=s[i]<=1,000,000,000,000,000 (10^15)
乙個整數,即最後集合可能的最大值sum。input示例
312output示例3
8
數學問題 線性基 貪心
顯然就是線性基。
假設我們需要k個數來搞出線性基,那麼有n-k個數可以取到異或空間裡的最大值max。
這k個數線性無關,為了使他們最大,我們先把它們消到盡可能小,再異或max。
↑把得到的n個數累加起來就是答案。
秒題三分鐘,寫題一小時?exm?
動態維護線性基看上去並沒有問題,然而交上去無限wawawa。
然後突然意識到年初的時候和sfailsth討論過的問題:高斯消元得到的線性基向量一定是該位為1的所有可能得到的向量中最小的,而動態維護線性基得到不一定是最小的。
於是手動把線性基向量消到最小,ac
1 #include2 #include3 #include4 #include5 #include6#define ll long long
7using
namespace
std;
8const
int mxn=65;9
ll read()
12while(ch>='
0' && ch<='9')
13return x*f;14}
15int
n;16
ll a[mxn],b[mxn],f[mxn];
17int
main()
25 b[i]^=f[j];26}
27}28 ll mx=0;int cnt=0;29
for(i=62;i>=0;i--)
30if
(f[i])
32 cnt++;33}
34 ll ans=0
;35 ans+=mx*(n-cnt+1
);36 cnt--;
37for(i=0;cnt && i<=62;i++)43}
44 ans+=mx^f[i];
45 cnt--;46}
47}48 printf("
%lld\n
",ans);
49return0;
50 }
51nod 1312 最大異或和
很顯然我們求出一組線性基來,如果有m個基,那麼可以構造n m 1個最大異或值 而對於線性基中的元素,除了最大的元素,我們用最大異或值異或掉每個元素累加進答案 而不是把線性基中的元素處理成乙個下三角矩陣 include include include include include include d...
51nod1312 最大異或和(線性基)
傳送門 先把線性基建出來 顯然其他所有數都可以湊成線性基的最大值 考慮怎麼讓線性基內和最大 手玩一下可以發現最優情況是最高位的都有,剩下每乙個基都少填乙個 include using namespace std const int rlen 1 20 1 inline chargc define i...
最大異或和
問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...