同余最短路RE求调
  • 板块灌水区
  • 楼主NahX_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/7 14:46
  • 上次更新2024/6/7 15:46:47
查看原帖
同余最短路RE求调
667795
NahX_楼主2024/6/7 14:46

P3403 跳楼机 50ptsRE求调

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e5+10;
int head[N*2],cnt;
struct edge{
	int to,nxt,w;
}e[2*N];
void add(int u,int v,int w){
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	e[cnt].w=w;
	head[u]=cnt;
} 
int dis[N];
struct node{
	int d,v;
	friend bool operator<(node x,node y){
		x.v>y.v;
	}
};
void dfs(int u,int w){
	priority_queue<node>dl;
	dl.push(node{u,w});
	dis[u]=0;
	while(!dl.empty()){
		node t=dl.top();
		dl.pop();
		if(t.v>dis[t.d])continue;
		for(int i=head[t.d];i;i=e[i].nxt){
			//cout<<t.d<<endl;
			if(dis[t.d]+e[i].w<dis[e[i].to]){
				dis[e[i].to]=dis[t.d]+e[i].w;
				dl.push(node{e[i].to,dis[e[i].to]});
			}
		}
	}
}
signed main(){
	int h;cin>>h;
	--h;
	int x,y,z;cin>>x>>y>>z;
	if(x>y)swap(x,y);
	if(x>z)swap(x,z);
	for(int i=0;i<x;i++){
		add(i,(i+y)%x,y),add(i,(i+z)%x,z);
		dis[i]=LONG_LONG_MAX;
	}
	dfs(0,0);
	int ans=0;
	for(int i=0;i<x;i++){
		if(h>=dis[i])
		ans+=(h-dis[i])/x+1;
	}
	cout<<ans;
	return 0;
}

悬赏@ zhuyihao20100712 qq

2024/6/7 14:46
加载中...