OI 萌新求助同余最短路
查看原帖
OI 萌新求助同余最短路
515129
TLEWA楼主2024/9/25 20:35
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=100005;

int n,q;
int v[N],c[N];
int mx;

vector<pair<int,int>> vec[N];

queue<int> que;bool vis[N];int dis[N];
void SPFA(int S) {
	fill(dis+1,dis+1+n,-1e18);
	dis[S]=0;que.push(S);
	
	int u;
	while(!que.empty()) {
		u=que.front();que.pop();
		vis[u]=0;
		for(auto& [v,w]:vec[u]) {
			if(dis[v]<dis[u]+w) {
				dis[v]=dis[u]+w;
				if(!vis[v]) que.push(v);
				vis[v]=1;
			}
		}
	}
}

signed main() {
	cin >> n >> q;
	for(int i=1;i<=n;++i) cin >> v[i] >> c[i];
	
	mx=1;
	for(int i=2;i<=n;++i) if(v[mx]*c[i]>v[i]*c[mx]) mx=i;
	
	for(int i=0;i<v[mx];++i) {
		for(int j=1;j<=n;++j) {
			vec[i].push_back({(i+v[j])%v[mx],c[j]-((i+v[j])/v[mx]*c[mx])});
		}
	}
	SPFA(0);
	
	int V;
	for(int i=1;i<=q;++i) {
		cin >> V;
		if(dis[V%v[mx]]==-1e18) cout << -1 << endl;
		else cout << V/v[mx]*c[mx]+dis[V%v[mx]] << endl;
	}
	
	return 0;
}

WA 求调

2024/9/25 20:35
加载中...