如题,当我一开始把dis数组开成ULL,赋值为2^63-1时,第4,5个点有问题
但当我把dis数组改成L,初值改为0x3f时,就过了
代码如下
#include <bits/stdc++.h>
#define N 3005
#define M 2000010
#define pii pair<int,int>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
#define int unsigned long long
//#define MOD
#define INF 1061109567
#define ULL 9223372036854775807
#define int_edge int to[M],nxt[M],head[N],cnt=0;
using namespace std;
int n,m,in[N],mn=N,dis[N],vis[N];
//int_edge;void add_edge(int x,int y ){to[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;}
int_edge;int val[M];void add_edge(int x,int y,int z){to[++cnt]=y;val[cnt]=z;nxt[cnt]=head[x];head[x]=cnt;}
struct Y{
int id,val;
friend bool operator < (Y x,Y y){
return x.val>y.val;
}
};
priority_queue<Y>q;
void dij(){
for(int i=0;i<mn;i++)dis[i]=ULL;
memset(vis,0,sizeof(vis));
dis[0]=0;q.push(Y{0,0});
while(!q.empty()){
int u=q.top().id;q.pop();
if(vis[u])continue;vis[u]=1;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(dis[v]>dis[u]+val[i]){
dis[v]=dis[u]+val[i];
q.push(Y{v,dis[v]});
}
}
}
}
signed main()
{
scanf("%llu %llu",&n,&m);
for(int i=1,x;i<=n;i++){
scanf("%llu",&x);mn=min(mn,x-m);
for(int j=x;j>=max(x-m,1ull);j--)in[j]=1;
}
if(mn<=1){puts("-1");return 0;}
for(int i=mn+1;i<N;i++)
if(in[i]){
for(int j=0;j<mn;j++)
add_edge(j,(j+i)%mn,i);
}
dij();
int ans=0;
for(int i=1;i<mn;i++)
{
//printf("%llu\n",dis[i]);
if(dis[i]==ULL){puts("-1");return 0;}
else ans=max(ans,dis[i]-mn);
}
if(ans>=INF)puts("-1");
else printf("%llu\n",ans);
return 0;
}
https://www.luogu.com.cn/record/93039170
这是未通过的
#include <bits/stdc++.h>
#define N 3005
#define M 2000010
#define pii pair<int,int>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
#define int long long
//#define MOD
#define INF 1061109567
#define ULL 9223372036854775807
#define int_edge int to[M],nxt[M],head[N],cnt=0;
using namespace std;
int n,m,in[N],mn=N,dis[N],vis[N];
//int_edge;void add_edge(int x,int y ){to[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;}
int_edge;int val[M];void add_edge(int x,int y,int z){to[++cnt]=y;val[cnt]=z;nxt[cnt]=head[x];head[x]=cnt;}
struct Y{
int id,val;
friend bool operator < (Y x,Y y){
return x.val>y.val;
}
};
priority_queue<Y>q;
void dij(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[0]=0;q.push(Y{0,0});
while(!q.empty()){
int u=q.top().id;q.pop();
if(vis[u])continue;vis[u]=1;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(dis[v]>dis[u]+val[i]){
dis[v]=dis[u]+val[i];
q.push(Y{v,dis[v]});
}
}
}
}
signed main()
{
scanf("%lld %lld",&n,&m);
for(int i=1,x;i<=n;i++){
scanf("%lld",&x);mn=min(mn,x-m);
for(int j=x;j>=max(x-m,1ll);j--)in[j]=1;
}
if(mn<=1){puts("-1");return 0;}
for(int i=mn+1;i<N;i++)
if(in[i]){
for(int j=0;j<mn;j++)
add_edge(j,(j+i)%mn,i);
}
dij();
int ans=0;
for(int i=1;i<mn;i++)
{
//printf("%lld\n",dis[i]);
if(dis[i]==INF){puts("-1");return 0;}
else ans=max(ans,dis[i]-mn);
}
printf("%lld\n",ans);
return 0;
}
https://www.luogu.com.cn/record/93039798
这是通过的