绷崩蚌
查看原帖
绷崩蚌
817925
whileAK楼主2024/4/4 13:31

为什么加强版过了这题不过啊,已经很仔细审题了,大佬能看看还有哪不一样吗QAQ

using namespace std;
typedef long long ll;
void rd(int &p){
    int f=1;p=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
    p*=f;
}
void rdl(ll &p){
    int f=1;p=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
    p*=f;
}
const int N=3e3+50;
int t,l,n,f[2][305][305],c[305][305],a[N],u;
unsigned char pr[N][305][305],an[N],b[2][N],d[305];
int main(){
    t=1;
    while(t--){
        rd(l),rd(n);
        for(int i(1);i<=l;++i){
            for(int j(1);j<=l;++j){
                rd(c[i][j]);
            }
        }
        memset(f,0x3f,sizeof(f));
        f[0][1][2]=0;a[0]=3;
        for(int i(1);i<=n;++i)rd(a[i]);
        for(int i(0);i<n;++i){
            memset(f[(i+1)&1],0x3f,sizeof(f[(i+1)&1]));
            for(int j(1);j<=l;++j){
                for(int k(1);k<=l;++k){
                    if(j==k||j==a[i]||k==a[i])continue;
                    if(f[(i+1)&1][j][k]>f[i&1][j][k]+c[a[i]][a[i+1]]){
                        f[(i+1)&1][j][k]=f[i&1][j][k]+c[a[i]][a[i+1]];
                        pr[i+1][j][k]=0;
                    }
                    if(f[(i+1)&1][a[i]][k]>f[i&1][j][k]+c[j][a[i+1]]){
                        f[(i+1)&1][a[i]][k]=f[i&1][j][k]+c[j][a[i+1]];
                        pr[i+1][a[i]][k]=j;
                    }
                    if(f[(i+1)&1][j][a[i]]>f[i&1][j][k]+c[k][a[i+1]]){
                        f[(i+1)&1][j][a[i]]=f[i&1][j][k]+c[k][a[i+1]];
                        pr[i+1][j][a[i]]=k;
                    }
                    if(f[(i+1)&1][k][j]>f[i&1][j][k]+c[a[i]][a[i+1]]){
                        f[(i+1)&1][k][j]=f[i&1][j][k]+c[a[i]][a[i+1]];
                        pr[i+1][k][j]=0;
                    }
                    if(f[(i+1)&1][k][a[i]]>f[i&1][j][k]+c[j][a[i+1]]){
                        f[(i+1)&1][k][a[i]]=f[i&1][j][k]+c[j][a[i+1]];
                        pr[i+1][k][a[i]]=j;
                    }
                    if(f[(i+1)&1][a[i]][j]>f[i&1][j][k]+c[k][a[i+1]]){
                        f[(i+1)&1][a[i]][j]=f[i&1][j][k]+c[k][a[i+1]];
                        pr[i+1][a[i]][j]=k;
                    }
                }
            }
        }
        int ans=0x7fffffff,x,y,z,xx,yy,zz;
        for(int i(1);i<=l;++i){
            for(int j(1);j<=l;++j){
                if(i==j||i==a[n]||j==a[n])continue;
                if(ans>f[n&1][i][j]){
                    ans=f[n&1][i][j];
                    x=i,y=j;
                }
            }
        }
        printf("%d\n",ans);
        for(int i(n);i;--i){
            an[i]=pr[i][x][y];b[0][i]=x,b[1][i]=y;
            if(an[i]==0)continue;
            if(x==a[i-1])x=an[i];
            else y=an[i];
        }b[0][0]=1,b[1][0]=2;
        xx=d[1]=1,yy=d[2]=2,zz=d[3]=3;
        for(int i(1);i<=n;++i){
            if(b[0][i]>b[1][i])swap(b[0][i],b[1][i]);
            if(a[i]<b[0][i]){
                x=a[i],y=b[0][i],z=b[1][i];
            }
            else if(a[i]<b[1][i]){
                x=b[0][i],y=a[i],z=b[1][i];
            }
            else x=b[0][i],y=b[1][i],z=a[i];
            if(d[a[i]]!=0){
                printf("%d ",d[a[i]]);
                continue;
            }
            u=6;
            if(d[x]!=0)u-=d[x];
            if(d[y]!=0)u-=d[y];
            if(d[z]!=0)u-=d[z];
            printf("%d ",u);
            if(d[x]!=0){
                if(xx==x)xx=0;
                if(yy==x)yy=0;
                if(zz==x)zz=0;
            }
            if(d[y]!=0){
                if(xx==y)xx=0;
                if(yy==y)yy=0;
                if(zz==y)zz=0;
            }
            if(d[z]!=0){
                if(xx==z)xx=0;
                if(yy==z)yy=0;
                if(zz==z)zz=0;
            }
            if(xx!=0){
                d[a[i]]=d[xx];d[xx]=0;
            }
            if(yy!=0){
                d[a[i]]=d[yy];d[yy]=0;
            }
            if(zz!=0){
                d[a[i]]=d[zz];d[zz]=0;
            }
            xx=x,yy=y,zz=z;
        }
    }
    return 0;
}```
2024/4/4 13:31
加载中...