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\n",dis[n]); return 0; }