Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34017 LYLAKIOIAKIOI 【S】T3 C++ 通过 100 1230 MS 28148 KB 3019 2024-11-01 15:47:10

Tests(20/20):


#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){ //memset(g,0xc0,sizeof(g)); //int inf=0xc0c0c0c0; //g[0][0][0][0]=0; 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/*+c[i][0]*/,tk=k/*+c[i][1]*/,tm=m/*+c[i][2]*/,tn=n/*+c[i][3]*/; 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 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,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; /*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]=max(f[p+1][i/2][j/2][k/2][m/2],f[p][i][j][k][m]); //if(p<=5)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++) a[i]=read(); for(int i=1;i<=K;i++) b[i]=read(); //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(){ //double c=clock(); for(int i=0;i<=15;i++){ for(int j=0;j<=3;j++){ if((i>>j)&1) c[i][j]=1; else c[i][j]=0; } } int t=read();while(t--) slv(); //cerr<<(clock()-c)/CLOCKS_PER_SEC<<endl; return 0; }


测评信息: