1 solutions

  • 0
    @ 2025-11-5 18:07:32

    C++ :

    #include<cstdio>
    #include<algorithm>
    #define L 1<<23
    #define C (c=*A++)
    #define ENS //__attribute__((optimize("-O2")))
    #define NES //__attribute__((optimize("-O2"))) __inline__ __attribute__((always_inline))
    #define N 51
    #define T 33
    #define Q 25
    
    struct node
    {int f,a,b;
    	NES bool operator<(node&x){return b==x.b?a==x.a?f<x.f:a<x.a:b<x.b;}
    	NES bool cmp(node&x){return a+b==x.a+x.b?a<x.a:a+b<x.a+x.b;}
    	NES node operator+(const node &x){return(node){f+x.f,a+x.a,b+x.b};}
    }g[Q][T],G[Q][T];
    const node t[T]={(node){1,1,2},(node){3,4,3},(node){2,2,2},(node){5,6,3},(node){6,7,5},(node){4,4,4},(node){4,5,4},(node){4,5,4},(node){3,3,2},(node){7,8,3},(node){8,10,5},(node){8,9,6},(node){8,8,6},(node){8,8,6},(node){9,10,5},(node){6,6,4},(node){7,8,5},(node){6,7,5},(node){6,7,4},(node){7,8,7},(node){7,8,5},(node){6,7,5},(node){7,8,7},(node){5,5,4},(node){5,5,5},(node){6,8,5},(node){5,6,4},(node){6,7,4},(node){7,8,5},(node){5,5,5},(node){5,6,5},(node){5,6,4},(node){4,4,2}};
    using namespace std;const int fac[5]={0,1,2,6,24};int test,n,k,e[T][T],a[N],b[N],c[N],q[4][4][4][4],cnt,f[Q][T],w[N],wt,ss[19];long long F[N][Q];char fl[L],*A=fl;
    NES void read(int&x){char c;for(x=0;'0'>C||c>'9';);while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+c-48,C;}NES void print(long long x){if(!x)putchar(48);else{for(wt=0;x;ss[++wt]=x%10,x/=10);for(;wt;putchar(ss[wt--]+48));}}
    NES void fix(node&a,node b){if(b<a)a=b;}NES void Fix(node&a,node b){if(b.cmp(a))a=b;}
    ENS int main()
    {int l,r,i,j,s;
    	for(l=0,k=1;k<=4;l=r,k++)
    	{for(i=0;i<k;a[i]=i,i++);
    		do{q[a[0]][a[1]][a[2]][a[3]]=cnt++;}while(next_permutation(a,a+k));
    		for(i=0;i<k;a[i]=i,i++);
    		do
    		{for(i=0;i<k;b[i]=i,i++);
    			do
    			{
    				for(i=0;i<k;c[b[a[i]]]=i,i++);
    				e[q[a[0]][a[1]][a[2]][a[3]]][q[b[0]][b[1]][b[2]][b[3]]]=q[c[0]][c[1]][c[2]][c[3]];
    			}while(next_permutation(b,b+k));
    		}while(next_permutation(a,a+k));
    		for(r=l+fac[k],i=l;i<r;g[1][i]=G[1][i]=t[i],f[1][i]=t[i].f,i++);
    		for(i=2;i<=fac[k];i++)
    		{
    			for(j=l;j<r;g[i][j]=g[i-1][j]+t[l],G[i][j]=G[i-1][j]+t[l],f[i][j]=f[i-1][j]+t[l].f,j++);
    			for(j=l;j<r;j++)
    				for(s=l;s<r;s++)
    				{
    					fix(g[i][e[j][s]],g[i-1][j]+t[s]);
    					Fix(G[i][e[j][s]],G[i-1][j]+t[s]);
    					if(f[i][e[j][s]]>f[i-1][j]+t[s].f)f[i][e[j][s]]=f[i-1][j]+t[s].f;
    				}
    		}
    	}
    	for(*(fl+fread(fl,1,L,stdin))=EOF,read(test);test--;)
    	{
    		for(read(n),read(k),l=0,i=1;i<k;l+=fac[i],i++);
    		for(i=n;i;w[i]=q[a[0]-1][a[1]-1][a[2]-1][a[3]-1],i--)for(a[0]=a[1]=a[2]=a[3]=1,j=0;j<k;read(a[j]),j++);
    		for(r=l+fac[k],i=1;i<=fac[k];F[1][i]=f[i][w[1]],i++);
    		for(i=2;i<=n;i++)
    			for(j=1;j<=fac[k];j++)
    			{int tmp=g[j][w[i]].b,t1;long long tp=G[j][w[i]].a;
    				if(F[i][j]=g[j][w[i]].a,tmp>fac[k])
    				{
    					if((t1=tmp-fac[k])&1)t1++,tmp=fac[k]-1;else tmp=fac[k];
    					F[i][j]+=t1*((1ll<<i-1)-1)*k;
    				}if(tmp>0)F[i][j]+=F[i-1][tmp];
    				if((tmp=G[j][w[i]].b)>fac[k])
    				{
    					if((t1=tmp-fac[k])&1)t1++,tmp=fac[k]-1;else tmp=fac[k];
    					tp+=t1*((1ll<<i-1)-1)*k;
    				}if(tmp>0)tp+=F[i-1][tmp];if(tp<F[i][j])F[i][j]=tp;
    			}print(F[n][1]),putchar('\n');
    	}
    }
    
    
    
    • 1

    Information

    ID
    18795
    Time
    3000ms
    Memory
    512MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By