subtask1WA求助,悬1关
查看原帖
subtask1WA求助,悬1关
759196
Chu_awa_xing楼主2024/5/5 09:58

task0都AC了,就卡在task1了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=5e6+99;
int w[505];
int n,l,r;
int f[maxn],ans;
int vis[maxn],cnt;
struct node{
	int nxt,to,w;
}edge[maxn*4];
int head[maxn];
void add(int u,int v,int w){
	edge[++cnt].to=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
	edge[cnt].w=w;
}
void spfa(){
	queue<int> q; 
	memset(f,0x3f3f3f3f,sizeof(f));
	memset(vis,0,sizeof(vis));
	q.push(0),vis[0]=1,f[0]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=edge[i].nxt){
			if(f[edge[i].to]>f[u]+edge[i].w){
				f[edge[i].to]=f[u]+edge[i].w;
				if(!vis[edge[i].to]){
					q.push(edge[i].to);
					vis[edge[i].to]=1;
				}
			}
		}
	}
}
signed main(){
	cin>>n>>l>>r;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	sort(w+1,w+n+1);
	for(int i=0;i<w[1];i++){
		for(int j=2;j<=n;j++){
			add(i,(i+w[j])%w[1],w[j]);
		}
	}
	spfa();
	for(int i=0;i<w[1];i++){
		if(f[i]<=r){ans+=(r-f[i])/w[1]+1;}
		if(f[i]<l){ans-=(l-1-f[i])/w[1]+1;}
	}
	cout<<ans<<endl;
	return 0;
}
2024/5/5 09:58
加载中...