WA on #3 求调悬关
查看原帖
WA on #3 求调悬关
347664
菲斯斯夫斯基楼主2024/3/25 19:36

rt,调了好久了,我要破防了,谢谢。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int t;
int n,m,h;
int l[N],s[N],f[N],vis[N];
struct ccf
{
	int to,x,y;
};
struct road
{
	int x,y;
	bool operator < (const road &a) const
	{
		return x>a.x;
	}
};
vector<ccf>r[N];
void exgcd(int a,int b,int &d,int &x,int &y)
{
	if(b==0)
	{
		d=a,x=1,y=0;
		return ;
	}
	exgcd(b,a%b,d,x,y);
	int tmp=x;
	x=y,y=tmp-(a/b)*y;
}
int dijkstra()
{
	for(int i=1;i<=n;i++)
		f[i]=1e18,vis[i]=0;
	f[1]=0;
	priority_queue<road>q;
	q.push({1,0});
	while(!q.empty())
	{
		int x=q.top().x;
		q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(auto i:r[x])
		{
			int k=0;
			if(f[x]<=i.x)k=i.x+1;
			else k=i.x+((f[x]-i.x-1)/i.y+1)*i.y+1;
			if(f[i.to]<=k)continue;
			f[i.to]=k,q.push({i.to,k});
		}
	}
	return f[n]==1e18?-1:f[n];
}
signed main()
{
	cin>>t;
	while(t--)
	{
		scanf("%lld%lld%lld",&n,&m,&h);
		for(int i=1;i<=n;i++)
			scanf("%lld",&l[i]);
		for(int i=1;i<=n;i++)
			scanf("%lld",&s[i]);
		for(int i=1;i<=m;i++)
		{
			int u,v;
			scanf("%lld%lld",&u,&v);
			int a=h,x=0,b=s[u]-s[v],y=0,c=l[v]-l[u],d=0;
			if(b<0)b=-b,c=-c;
			exgcd(a,b,d,x,y);
			if(c%d!=0)continue;
			x*=c/d,y*=c/d;
			if(y>0)y%=a/d;
			else if(y%(a/d)==0)y=0;
			else y+=(a/d)*(-y/(a/d)+1);
			int k=abs(s[u]-s[v]);
			k=h/__gcd(k,h);
			r[u].push_back({v,y,k});
			r[v].push_back({u,y,k});
//			cout<<"r:"<<u<<' '<<v<<' '<<y<<' '<<k<<endl;
		}
		printf("%lld\n",dijkstra());
		for(int i=1;i<=n;i++)
			r[i].clear();
	}
	return 0;
}
2024/3/25 19:36
加载中...