30分/0分警示后人
查看原帖
30分/0分警示后人
743127
Wu1hong2shen4楼主2023/8/11 20:20

我错的可能太睿智了:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int T = 2e6+10;
struct eee {
	int to,nex,w;
}edge[T<<1];
int head[T],cnt = 0;
void add(int u,int v,int w) {
	cnt++;
	edge[cnt].to = v;
	edge[cnt].w = w;
	edge[cnt].nex = head[u];
	head[u] = cnt;
}
int n,m,b;
int mon[T];

int d[T],vis[T];
void dij(int s,int xian) {
	memset(d,63,sizeof(d));
	memset(vis,0,sizeof(vis));
	d[s] = 0;
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int>> >q;
	q.push(make_pair(0,s));
	int last,lin,dd;
	while(q.size()) {
		last = q.top().second;
		q.pop();
		if(vis[last]) continue;
		vis[last] = 1;
		for(int i = head[last];i;i = edge[i].nex) {
        if(mon[lin] > xian) continue;//33行
			lin = edge[i].to,dd = edge[i].w;//34行
			if(d[lin] > d[last]+dd) {
				d[lin] = d[last]+dd;
				q.push(make_pair(d[lin],lin));
			}
		}
	}
}

int mmm[T];

signed main() {
	scanf("%lld%lld%lld",&n,&m,&b);
	for(int i = 1;i <= n;mmm[i] = mon[i],i++)
		scanf("%lld",&mon[i]);
	int u,v,w;
	for(int i = 1;i <= m;i++) {
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	sort(mmm+1,mmm+n+1);
	int ans = 0;
	for(int i = (1 << 14);i;i >>= 1) {
		if(ans+i <= n) {
			if(mmm[ans+i] < mon[1] || mmm[ans+i] < mon[n]) {
				ans += i;
				continue;
			}
			dij(1,mmm[ans+i]);
			if(d[n] > b)
				ans += i;
		}
	}
	ans++;
	if(ans > n) printf("AFK");
	else printf("%lld",mmm[ans]);
	return 0;
}

第33行和第34行,应先赋值在判断

如果开 long long RE 0分,不开 AC + WA 30分,不知道是神马原因

2023/8/11 20:20
加载中...