求最短路写了 dij 和 spfa,全部都是 TLE 65pts
为什么捏
dij
#include<iostream>
#include<queue>
#include<cstring>
#define ll long long
#define int long long
using namespace std;
const int N=5e5+10;
ll n,l,r,d[N];
bool vis[N];
int ver[N<<1],ne[N<<1],e[N<<1],he[N],tot,a[14];
void add(int u,int v,int w){
ver[++tot]=v;
ne[tot]=he[u];
he[u]=tot;
e[tot]=w;
}
int minn;
void dij(){
for(int i=1;i<minn;++i) d[i]=1e18;
d[0]=0;
priority_queue<pair<int,int> >q;
q.push(make_pair(0,0));
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(int i=he[u];i;i=ne[i]){
int v=ver[i],w=e[i];
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push(make_pair(-d[v],v));
}
}
}
}
signed main(){
cin>>n>>l>>r; --l;
minn=1e18;
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
minn=min(minn,a[i]);
}
for(int i=0;i<minn;++i)
for(int j=1;j<=n;++j) add(i,(i+a[j])%minn,a[j]);
dij();
int ans=0;
for(int i=0;i<minn;++i){
// cout<<d[i]<<endl;
if(r>=d[i]) ans+=(r-d[i])/minn+1;
if(l>=d[i]) ans-=(l-d[i])/minn+1;
}
cout<<ans<<endl;
return 0;
}
spfa
#include<iostream>
#include<queue>
#include<cstring>
#define ll long long
#define int long long
using namespace std;
const int N=5e5+10;
ll n,l,r,d[N];
bool vis[N];
int ver[N<<1],ne[N<<1],e[N<<1],he[N],tot,a[14];
void add(int u,int v,int w){
ver[++tot]=v;
ne[tot]=he[u];
he[u]=tot;
e[tot]=w;
}
void dij(){
memset(d,0x7f,sizeof d);
d[0]=0;
priority_queue<pair<int,int> >q;
q.push(make_pair(0,0));
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(int i=he[u];i;i=ne[i]){
int v=ver[i],w=e[i];
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push(make_pair(-d[v],v));
}
}
}
}
int spfa(){
queue<int>q;
memset(d,0x7f,sizeof d);
d[0]=0; vis[0]=1;
q.push(0);
while(!q.empty()){
int u=q.front(); q.pop();
vis[u]=0;
for(int i=he[u];i;i=ne[i]){
int v=ver[i];
if(d[v]>d[u]+e[i]){
d[v]=d[u]+e[i];
if(vis[v]) continue;
vis[v]=1;
q.push(v);
}
}
}
return 1;
}
signed main(){
scanf("%lld%lld%lld",&n,&l,&r); --l;
int minn=1e9;
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
minn=min(minn,a[i]);
}
for(int i=0;i<minn;++i)
for(int j=1;j<=n;++j) add(i,(i+a[j])%minn,a[j]);
spfa();
int ans=0;
for(int i=0;i<minn;++i){
// cout<<d[i]<<endl;
if(r>=d[i]) ans+=(r-d[i])/minn+1;
if(l>=d[i]) ans-=(l-d[i])/minn+1;
}
cout<<ans<<endl;
return 0;
}