为何double能过,long long只有九十?
查看原帖
为何double能过,long long只有九十?
635829
D_FANG楼主2024/12/25 12:26

rt,long long的版本第五个测试点错得离谱,非精度问题,输出500万

long long版本:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1e3;
struct pai{
	int s,e;
	long long d;
}a[2*N];
struct rec{
	int e,nex;
	long long d;
}z[2*N];
int en,fi[N];
void add(int s,int e,long long d){
	z[++en].e=e;
	z[en].nex=fi[s];
	z[en].d=d;
	fi[s]=en;
}
int n,m;
long long val[N],d[N];
void init(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;++i) scanf("%lld",&val[i]);
	for (int i=1;i<=m;++i){
		scanf("%d%d%lld",&a[i].s,&a[i].e,&a[i].d);
	}
}
int cnt[N];
bool inq[N];
queue<int>q;
bool spfa(int u){
	d[u]=0;inq[u]=true;
	q.push(u);
	while (q.empty()==false){
		u=q.front();
		q.pop();inq[u]=false;
		for (int i=fi[u];i!=0;i=z[i].nex){
			if (d[z[i].e]<d[u]+z[i].d){
				d[z[i].e]=d[u]+z[i].d;
				cnt[z[i].e]=cnt[u]+1;
				if (cnt[z[i].e]>n+1) return true;
				if (inq[z[i].e]==false){
					inq[z[i].e]=true;
					q.push(z[i].e);
				}
			}
		}
	}
	return false;	
}
bool check(long long tim){
	en=0;
	printf("mid=%lld\n",tim);
	for (int i=1;i<=n+1;++i) fi[i]=0;
	for (int i=1;i<=m;++i){
		add(a[i].s,a[i].e,1000000*val[a[i].s]-tim*a[i].d);
//		printf("s=%d e=%d val=%lld\n",a[i].s,a[i].e,val[a[i].s]-tim*a[i].d);
	}
	printf("\n");
	for (int i=1;i<=n;++i){
		add(n+1,i,0);
	}
	for (int i=1;i<=n+1;++i){
		cnt[i]=0;d[i]=-1e18;inq[i]=false;
	}
	while (q.empty()==false) q.pop();
	return spfa(n+1);
}
void work(long long l,long long r){
	double v;
	long long mid;
	while (l<r){
		mid=(l+r+1)>>1;
		if (check(mid)==true) l=mid;
		else r=mid-1;
	}
	v=1.0*l/1000000;
	printf("%.2lf",v);
}
int main(){
	init();
	work(0,1e18);
	return 0;
}

double 版本:

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+1e3;
struct pai{
	int s,e;
	double d;
}a[2*N];
struct rec{
	int e,nex;
	double d;
}z[2*N];
int en,fi[N];
void add(int s,int e,double d){
	z[++en].e=e;
	z[en].nex=fi[s];
	z[en].d=d;
	fi[s]=en;
}
int n,m;
double val[N],d[N];
void init(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;++i) scanf("%lf",&val[i]);
	for (int i=1;i<=m;++i){
		scanf("%d%d%lf",&a[i].s,&a[i].e,&a[i].d);
	}
}
int cnt[N];
bool inq[N];
queue<int>q;
bool spfa(int u){
	d[u]=0;inq[u]=true;
	q.push(u);
	while (q.empty()==false){
		u=q.front();
		q.pop();inq[u]=false;
		for (int i=fi[u];i!=0;i=z[i].nex){
			if (d[z[i].e]<d[u]+z[i].d){
				d[z[i].e]=d[u]+z[i].d;
				cnt[z[i].e]=cnt[u]+1;
				if (cnt[z[i].e]>n+1) return true;
				if (inq[z[i].e]==false){
					inq[z[i].e]=true;
					q.push(z[i].e);
				}
			}
		}
	}
	return false;	
}
bool check(double tim){
	en=0;
//	printf("mid=%.2lf\n",tim);
	for (int i=1;i<=n+1;++i) fi[i]=0;
	for (int i=1;i<=m;++i){
		add(a[i].s,a[i].e,val[a[i].s]-tim*a[i].d);
//		printf("s=%d e=%d val=%lld\n",a[i].s,a[i].e,val[a[i].s]-tim*a[i].d);
	}
//	printf("\n");
	for (int i=1;i<=n;++i){
		add(n+1,i,0);
	}
	for (int i=1;i<=n+1;++i){
		cnt[i]=0;d[i]=-1e18;inq[i]=false;
	}
	while (q.empty()==false) q.pop();
	return spfa(n+1);
}
void work(long long l,long long r){
	double v;
	long long mid;
	while (l<r){
		mid=(l+r+1)>>1;
		v=1.0*mid/1000000;
		if (check(v)==true) l=mid;
		else r=mid-1;
	}
	v=1.0*l/1000000;
	printf("%.2lf",v);
}
int main(){
	init();
	work(0,1e18);
	return 0;
}
2024/12/25 12:26
加载中...