为什么一直 TLE 捏
查看原帖
为什么一直 TLE 捏
398190
lanretE楼主2023/2/6 13:49

求最短路写了 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;
}
2023/2/6 13:49
加载中...