萌新求助,为什么这道题开Unsigned long long反而过不去
  • 板块P2662 牛场围栏
  • 楼主shight
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/6 14:54
  • 上次更新2023/10/27 04:03:36
查看原帖
萌新求助,为什么这道题开Unsigned long long反而过不去
114859
shight楼主2022/11/6 14:54

如题,当我一开始把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

这是通过的

2022/11/6 14:54
加载中...