提交时间:2024-11-01 18:39:40
运行 ID: 34027
#include<bits/stdc++.h> using namespace std; #define int long long #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v #define pb push_back #define popcnt __builtin_popcount int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=300010,N=20,V=10,M=32,Mod=998244353,base=131,inf=1000000000; // struct Edge{int v,nx;}edge[MAXN];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;} int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} int n,k,ans,p[MAXN],q[MAXN],f[M][N][V][V][V][V]; void mx(int &x,int y){x=max(x,y);} bool fl; void DP1(int i){ bool A=(q[1]>>i)&1,B=(q[2]>>i)&1,C=(q[3]>>i)&1,D=(q[4]>>i)&1; for(int a=0;a<4;a++){ for(int b=0;b<4;b++){ for(int c=0;c<4;c++){ for(int d=0;d<4;d++){ mx(f[i][0][(a<<1)|A][(b<<1)|B][(c<<1)|C][(d<<1)|D],f[i+1][n][a][b][c][d]); } } } } } void DP2(int i,int j){ bool A=j&1,B=(j>>1)&1,C=(j>>2)&1,D=(j>>3)&1; for(int a=0;a<9;a++){ for(int b=0;b<9;b++){ for(int c=0;c<9;c++){ for(int d=0;d<9;d++){ mx(f[i][j][a][b][c][d],f[i][j-1][a][b][c][d]); if(a>=A&&b>=B&&c>=C&&d>=D) mx(f[i][j][a-A][b-B][c-C][d-D],f[i][j-1][a][b][c][d]+p[j]*(1ll<<i)); } } } } } void slv(){ k=read();ans=0; n=(1<<k)-1; for(int i=1;i<=n;i++)p[i]=read(); for(int i=1;i<=k;i++)q[i]=read(); memset(f,-0x3f,sizeof(f)); f[31][n][0][0][0][0]=0; for(int i=30;~i;i--){ DP1(i); for(int j=1;j<16;j++){ DP2(i,j); } } printf("%lld\n",f[0][n][0][0][0][0]); } signed main(){ int _=read();while(_--) slv(); return 0; }