for Integer Distribution
Problem
#include<bits/stdc++.h>
using namespace std;
#define int long
#define pii pair<long,long>
int n;
const long MAX_VAL = 1e11, MIN_VAL = -1e11;
unordered_map<long,pii> dp;
vector<int> v;
pii recur(int idx,int mask){
if(idx>=n){
return mask==0 ? pair<int,int>{0,0} : pair<int,int>{MAX_VAL,MIN_VAL};
}
if(dp.count(mask*100+idx))
return dp[mask*100+idx];
pii res = pair<int,int>{MAX_VAL,MIN_VAL};
res = recur(idx+1,mask|(1<<idx));
for(int j=0;j<20;++j){
if(mask&(1<<j)){
int val = v[j] ^ v[idx];
int newMask = mask & (~(1<<j));
pii temp = recur(idx+1,newMask);
res.first = min(res.first,val+temp.first);
res.second = max(res.second,val+temp.second);
}
}
return dp[mask*100+idx] = res;
}
void solve(){
cin>>n;
v.resize(n);
for(int i=0;i<n;++i)
cin>>v[i];
pii res = recur(0,0);
cout<<res.first<<" "<<res.second;
}
signed main(){
solve();
return 0;
}