题解 P6622 【[2020 年联考 A 卷] 信号传递【暂无数据】】
upd: 补充代码
设
设
预处理
因为转移共有
进一步观察转移的式子,可以发现转移中
因此,设
这样就得到了一个时空复杂度均为
但是空间复杂度过高,需要继续优化。
观察到转移的时候只会从
#include<bits/stdc++.h>
using namespace std;
#define V inline void
#define FOR(i,a,b) for(int i=a;i<=b;i++)
const int N=23,M=14e5,INF=0x7fffffff;
int n,m,k,S,cnt,tot,f[1<<N];
int e[N][N],to[2][M][N],w[2][M];
V add_edge(int x,int y){if(x!=y&&x)e[x-1][y-1]++;}
V input(){
scanf("%d%d%d",&n,&m,&k),(S=1<<m)--;
for(int x=0,y;n--;add_edge(x,y),x=y)scanf("%d",&y);
}
V init(){
FOR(i,1,S)f[i]=INF;
FOR(i,0,m-1)FOR(j,0,m-1)to[0][0][j]+=e[i][j]*k-e[j][i];
}
V cmin(int&x,int y){if(y-x>>31)x=y;}
V ins(int*a,int x,int*b){FOR(i,0,m-1)b[i]=a[i]+e[x][i]*(1-k)+e[i][x]*(k+1);}
V work(){
int p=0,q;
FOR(x,1,m){
tot=-1,q=p^1;
FOR(i,0,cnt)FOR(j,0,m-1)if(!(w[p][i]>>j))
w[q][++tot]=1<<j|w[p][i],ins(to[p][i],j,to[q][tot]);
FOR(i,0,cnt)FOR(j,0,m-1)if(~w[p][i]>>j&1)
cmin(f[1<<j|w[p][i]],f[w[p][i]]+to[p][i][j]*x);
p=q,cnt=tot;
}
cout<<f[S];
}
int main(){
// freopen("test.in","r",stdin);
input();
init();
work();
return 0;
}
这份代码在 LOJ 上可以通过,但是在洛谷上无法通过...
如果有人知道什么高妙的卡常方法,请务必告诉我。