同余最短路万紫千红45pts求助
查看原帖
同余最短路万紫千红45pts求助
362101
_TLEer_的小号楼主2021/7/20 16:48

Rt.

code:

#include<iostream>
#include<cstring>
#include<algorithm>
#define re register
#define eps 1e-10
#define int long long
using namespace std;
int lnsz,hd[5000010],n,l,r,arr[20],dis[5000010];
bool inq[5000010];
struct ln{
	int u,v,nxt,w;
}a[2000010];
inline void add(int u,int v,int w=0){
	a[++lnsz].u=u;
	a[lnsz].v=v;
	a[lnsz].w=w;
	a[lnsz].nxt=hd[u];
	hd[u]=lnsz;
}
void dfs_spfa(int t){
	inq[t]=true;
	for(re int i=hd[t];i;i=a[i].nxt){
		if(dis[a[i].v]>dis[t]+(a[i].w)){
			if(inq[a[i].v])
				return;
			dis[a[i].v]=dis[t]+a[i].w;
			dfs_spfa(a[i].v);
		}
	}
	inq[t]=false; 
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
	memset(dis,0x3f,sizeof(dis));
	dis[0]=0;
	cin>>n>>l>>r;
	for(re int i=0;i<n;i++)cin>>arr[i];
	sort(arr,arr+n);
	for(re int i=0;i<arr[0];i++)
		for(re int j=1;j<n;j++)
			add(i,(i+arr[j])%arr[0],arr[j]);
	dfs_spfa(0);
	int ans=0;
	for(re int i=0;i<arr[0];i++){
		if(dis[i]<=r)
			ans+=(r-dis[i])/arr[0]+1;
		if(dis[i]<l)
			ans-=(l-1-dis[i])/arr[0]+1;
	}
	cout<<ans<<endl;
	return 0;
}
2021/7/20 16:48
加载中...