1 条题解
-
0

// 同余最短路 Dijkstra 算法 O(MlogN) #include<bits/stdc++.h> #define int long long #define pii pair<int,int> using namespace std; const int N=3005,M=3e6; //M=1500*1500 int idx,h[M],ww[M],to[M],ne[M]; void add(int x,int y,int z){ to[++idx]=y;ww[idx]=z;ne[idx]=h[x];h[x]=idx; } int n,m; int a[N],b[N]; int d[M],vis[M]; int ma=0,mi=3000; void dijkstra(){ for(int i=0;i<mi;i++) d[i]=1e18; d[0]=0; priority_queue<pii,vector<pii>,greater<pii> >q; q.push({0,0}); while(!q.empty()){ int u=q.top().second; q.pop(); if(vis[u]) continue; vis[u]=true; for(int i=h[u];i;i=ne[i]){ int v=to[i],w=ww[i]; if(d[v]>d[u]+w){ d[v]=d[u]+w; q.push({d[v],v}); } } } } signed main(){ scanf("%lld%lld",&n,&m); for(int i=1,l;i<=n;i++){ scanf("%lld",&l); mi=min(mi,l-m); ma=max(ma,l); for(int j=l-m;j<=l;j++) b[j]=1; //j是有用长度 } if(mi<=1){puts("-1"); return 0;} for(int i=0;i<mi;i++)for(int j=mi;j<=ma;j++) if(b[j]==1) add(i,(i+j)%mi,j); //建图 dijkstra(); ma=*max_element(d,d+mi); if(ma==1e18) puts("-1"); else printf("%lld\n",ma-mi); }
- 1
信息
- ID
- 12492
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 11
- 已通过
- 3
- 上传者