Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34005 | LYLAKIOIAKIOI | 【S】T3 | C++ | 运行出错 | 0 | 0 MS | 260 KB | 2598 | 2024-11-01 15:14:03 |
#include<bits/stdc++.h> #define ll long long #define gc getchar using namespace std; const int N=10,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; } inline void dp1(){ memset(g,0xc0,sizeof(g)); //int inf=0xc0c0c0c0; g[0][0][0][0]=0; int v=1<<K; for(int i=1;i<v;i++) for(int j=v/2;j>=0;j--) for(int k=v/2;k>=0;k--) for(int m=v/2;m>=0;m--) for(int n=v/2;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++; g[tj][tk][tm][tn]=max(g[tj][tk][tm][tn],g[j][k][m][n]+a[i]); } }inline void upd(int a,int b,int c,int d,int id){ ll tmp=0;//ll val=1ll<<id; for(int i=a;i>=0;i--){ for(int j=b;j>=0;j--){ for(int k=c;k>=0;k--){ for(int m=d;m>=0;m--){ if(g[a-i][b-j][c-k][d-m]<0) continue; tmp=max(tmp,f[id][i][j][k][m]+(g[a-i][b-j][c-k][d-m]<<id)); } } } }f[id][a][b][c][d]=tmp; }inline void dp2(){ memset(f,0,sizeof(f)); int LM=31;int v=(1<<K)/2; for(int p=0;p<=LM;p++){ int m1=v,m2=v,m3=v,m4=v; if((b[1]>>p)&1) m1++; if((b[2]>>p)&1) m2++; if((b[3]>>p)&1) m3++; if((b[4]>>p)&1) m4++; //cout<<m1<<' '<<m2<<' '<<m3<<' '<<m4<<endl; //if(K<4) m4=0;if(K<3) m3=0; for(int i=m1;i>=0;i--,i--){//if((i&1)!=((b[1]>>p)&1)) continue; for(int j=m2;j>=0;j--,j--){//if((j&1)!=((b[2]>>p)&1)) continue; for(int k=m3;k>=0;k--,k--){//if((k&1)!=((b[3]>>p)&1)) continue; for(int m=m4;m>=0;m--,m--){//if((m&1)!=((b[4]>>p)&1)) continue; upd(i,j,k,m,p),f[p+1][i/2][j/2][k/2][m/2]=f[p][i][j][k][m]; //cout<<p<<' '<<i<<' '<<j<<' '<<k<<' '<<m<<' '<<f[p][i][j][k][m]<<endl; }}}} } }//2222620967023410 inline void slv(){ //double c=clock(); K=read();int v=(1<<K); memset(a,0,sizeof(a));memset(b,0,sizeof(b)); for(int i=1;i<v;i++) cin>>a[i]; for(int i=1;i<=K;i++) cin>>b[i]; dp1();dp2(); //for(int i=0;i<=v;i++)for(int j=0;j<=v;j++) cout<<i<<' '<<j<<' '<<g[i][j][0][0]<<endl; printf("%lld\n",f[32][0][0][0][0]); } int main(){ freopen("enum.in","r",stdin); freopen("enum.out","w",stdout); int t=read();while(t--) slv(); return 0; }