提交时间:2024-11-01 18:31:00
运行 ID: 34026
#include<bits/stdc++.h> #define ll long long #define gc getchar using namespace std; const int N=18,W=34; ll f[W][N][N][N][N]; ll g[N][N][N][N]; int a[W>>1],b[N];int K; inline int read(){ int t=0,f=1;char ch; while(!(ch>='0'&&ch<='9')){ if(ch=='-') f=-1;ch=gc(); }while(ch>='0'&&ch<='9') t=t*10+ch-'0',ch=gc(); return t*f; }bool c[W][N]; inline void dp1(int id){ int v=1<<K;int v2=v/2+2; for(int i=1;i<v;i++) for(int j=v2;j>=0;j--) for(int k=v2;k>=0;k--) for(int m=v2;m>=0;m--) for(int n=v2;n>=0;n--){ int tj=j,tk=k,tm=m,tn=n; if(i&1) tj++;if((i>>1)&1) tk++; if((i>>2)&1) tm++;if((i>>3)&1) tn++; if(f[id][j][k][m][n]<0) continue; f[id][tj][tk][tm][tn]=max(f[id][tj][tk][tm][tn],f[id][j][k][m][n]+1ll*a[i]*(1ll<<id)); } }inline void dp(){ memset(f,0xc0,sizeof(f)); f[0][0][0][0][0]=0; int LM=31;int v=(1<<K)/2+2; for(int p=0;p<=LM;p++){ dp1(p); int m1=v,m2=v,m3=v,m4=v; for(int i=m1;i>=0;i--){if((i&1)!=((b[1]>>p)&1)) continue; for(int j=m2;j>=0;j--){if((j&1)!=((b[2]>>p)&1)) continue; for(int k=m3;k>=0;k--){if((k&1)!=((b[3]>>p)&1)) continue; for(int m=m4;m>=0;m--){if((m&1)!=((b[4]>>p)&1)) continue; f[p+1][i/2][j/2][k/2][m/2]=max(f[p+1][i/2][j/2][k/2][m/2],f[p][i][j][k][m]); }}}} } } inline void slv(){ K=read();int v=(1<<K); memset(a,0,sizeof(a));memset(b,0,sizeof(b)); for(int i=1;i<v;i++) a[i]=read(); for(int i=1;i<=K;i++) b[i]=read(); dp(); printf("%lld\n",f[32][0][0][0][0]); } int main(){ int t=read();while(t--) slv(); return 0; }