玄关,求助
查看原帖
玄关,求助
752397
Vae_L楼主2024/3/2 08:34

被hack一早晨了,到底哪里有问题啊

#include<bits/stdc++.h>
#define int long long
using namespace std;
int head[5000010],cnt,d[5000005],n,l,r,w[50];
bool vis[5000005];
struct node{
    int to,next,w;
}a[5000005];
queue<int>q;
void add(int u,int v,int w)
{
    a[++cnt]={v,head[u],w};
    head[u]=cnt;
}
struct edge{
	int w,to;
	bool operator <( const edge &x )const
    {
        return x.w < w;
    }
};
void dijkstra(int s)
{
    priority_queue<edge>q;
	memset(d,0x7f,sizeof d);
	d[s]=0;
	q.push({0,s});
	while(!q.empty())
	{
		int x=q.top().to;
		int y=q.top().w;
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];~i;i=a[i].next)
		{
			int l=a[i].to;
			int r=a[i].w;
			if(d[x]+r<d[l])
	        {
	        	d[l]=d[x]+r;
				if(!vis[l])
				{
	                q.push({d[x]+r,l}); 
				}
			}
		} 
	}
}
signed main()
{ 
    memset(head,-1,sizeof head); 
    scanf("%lld%lld%lld",&n,&l,&r);
    bool flag=0;
    int len=0;
    for(int i=1;i<=n;i++) 
	{
		int x;
		scanf("%lld",&x);
		if(x) flag=1,w[++len]=x;
	}
    sort(w+1,w+n+1);
    int mi=w[1];
    for(int i=0;i<mi;i++)
    {
    	for(int j=2;j<=len;j++) add(i,(i+w[j])%mi,w[j]);
	}
	dijkstra(0);
	int ans1=0,ans2=0;
	for(int i=0;i<mi;i++)
	{
		if(d[i]<=r) ans1+=((r-d[i])/mi+1LL);
		if(d[i]<l) ans2+=((l-d[i]-1LL)/mi+1LL); 
	}
	printf("%lld",ans1-ans2);
    return 0;
}
2024/3/2 08:34
加载中...