[spfa] Jzoj P5864 很多序列
题解
- 考虑建图跑,从每个点的u按边权为x[i]向(u+x[i])%x[1]
- 跑spfa,答案就是最大取不到的数(最大值-x1)
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <queue> 4 #include <cstring> 5 using namespace std; 6 int n; 7 long long a[7],visit[1000010],dis[1000010],ans; 8 queue<int> Q; 9 int main() 10 { 11 freopen("sequence.in","r",stdin); 12 freopen("sequence.out","w",stdout); 13 scanf("%d",&n); 14 for (int i=1;i<=n;i++) scanf("%lld",&a[i]); 15 if (n==2) 16 { 17 printf("%lld",a[1]*a[2]-a[1]-a[2]); 18 return 0; 19 } 20 memset(dis,-1,sizeof(dis)); 21 Q.push(0),visit[0]=1,dis[0]=0; 22 while (!Q.empty()) 23 { 24 int u=Q.front(); Q.pop(),visit[u]=0; 25 for (int i=2;i<=n;i++) 26 { 27 long long v=(u+a[i]%a[1])%a[1]; 28 if (dis[v]==-1||dis[u]+a[i]<dis[v]) 29 { 30 dis[v]=dis[u]+a[i]; 31 if (!visit[v]) Q.push(v),visit[v]=1; 32 } 33 } 34 } 35 ans=-1; 36 for (int i=1;i<a[1];i++) ans=max(ans,dis[i]); 37 printf("%lld",ans-a[1]); 38 }