zoukankan      html  css  js  c++  java
  • BZOJ 3040. 最短路(road)

    传送门

    就是个最短路....数据过于垃圾,随机边不用连都可以 $Ac$

    这里用的是线段树优化 $Dijkstra$ ,这样就不会一个节点反复进入堆里占空间了,速度显然更快

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        register int x=0,f=1; register char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=1e6+7,M=1e7+7;
    const ll INF=1e18;
    int n,m;
    int fir[N],from[M],to[M],val[M],cntt;
    inline void add(int &a,int &b,int c) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; val[cntt]=c; }
    ll dis[N],A[N];
    int T[N<<2];
    void build(int o,int l,int r)
    {
        T[o]=l; if(l==r) { A[l]=INF; return; }
        register int mid=l+r>>1;
        if(l<=mid) build(o<<1,l,mid);
        if(mid<r) build(o<<1|1,mid+1,r);
    }
    void change(int o,int l,int r,int k,ll v)
    {
        if(l==r) { A[l]=v; return; }
        register int mid=l+r>>1,lc=o<<1,rc=lc|1;
        k<=mid ? change(lc,l,mid,k,v) : change(rc,mid+1,r,k,v);
        T[o]=(A[T[lc]]<A[T[rc]] ? T[lc] : T[rc]);
    }
    void Dijk()
    {
        for(register int i=1;i<=n;i++) dis[i]=INF;
        dis[1]=0; build(1,1,n); change(1,1,n,1,0);
        while(A[T[1]]<INF)
        {
            register int x=T[1]; register ll d=dis[x]; change(1,1,n,x,INF);
            for(register int i=fir[x];i;i=from[i])
            {
                register int &v=to[i]; if(dis[v]<=d+val[i]) continue;
                dis[v]=d+val[i]; change(1,1,n,v,dis[v]);
            }
        }
    }
    int main()
    {
        n=read(),m=read(); register int T,rxa,rxc,rya,ryc,rp; register int x=0,y=0,z=0;
        T=read(),rxa=read(),rxc=read(),rya=read(),ryc=read(),rp=read();
        for(register int i=1;i<=T;i++)
        {
            x=(1ll*x*rxa+rxc)%rp; y=(1ll*y*rya+ryc)%rp;
            register int a=min(x%n+1,y%n+1),b=max(y%n+1,y%n+1);
            add(a,b,100000000-100*a);
        }
        for(register int i=T+1;i<=m;i++)
        {
            x=read(),y=read(),z=read();
            add(x,y,z);
        }
        Dijk(); printf("%lld
    ",dis[n]);
        return 0;
    }
  • 相关阅读:
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Symmetric Tree
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Triangle
    Populating Next Right Pointers in Each Node II
    Pascal's Triangle II
    Pascal's Triangle
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11495289.html
Copyright © 2011-2022 走看看