1 条题解

  • 0
    @ 2026-6-16 9:53:52

    // 同余最短路 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

    D123【模板】同余最短路 Dijkstra 算法 P2662 [WC2002] 牛场围栏

    信息

    ID
    12492
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    11
    已通过
    3
    上传者