不知道为什么RE了,求检查
  • 板块学术版
  • 楼主ForwardStar
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 21:09
  • 上次更新2023/10/22 21:13:50
查看原帖
不知道为什么RE了,求检查
550577
ForwardStar楼主2023/10/22 21:09

今天第二场cf div2的E,数组大小是没有问题的。

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <queue>
#include <map>
#include <set>
#define int long long
using namespace std;
const int N = 5e5 + 55, inf = 2147483647;
int n, t, tot, k;
int h[N], vis[N], b[N];
struct edge {
	int v, w, nxt;
} e[N << 1];
vector<int> a[N];
void add(int x, int y, int z) {
	e[++tot] = {y, z, h[x]};
	h[x] = tot;
}
struct node {
	int id, step;
};
int find(int z, int kk){
	int l = 0, r = a[z].size() - 1;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (a[z][mid] <= kk) l = mid + 1;
		else r = mid;
	}
	return a[z][l];
}
int bfs() {
	queue<node> q;
	int ans = 1e9;
	q.push({1, 0});
	vis[1] = 1;
	while (q.size()) {
		node f = q.front();
		q.pop();
		if (f.id == n) {
			ans = min(ans, f.step);
			continue;
		}		
		if (f.step == k) {
			if (q.size() == 0) break;
			continue;
		}
		for (int i = h[f.id]; i; i = e[i].nxt) {
			if (vis[e[i].v] == 0) {
				int rr = find(e[i].w, f.step);
				if (rr > f.step) q.push({e[i].v, rr});
				vis[e[i].v] = 1;
			}
		}
	}
	if (ans == 1e9) return -1;
	return ans;
}
signed main() {
	scanf("%lld%lld", &n, &t);
	for (int i = 1; i <= t; i++) {
		int m;
		scanf("%lld", &m);
		for (int j = 1; j <= m; j++) {
			int x, y;
			scanf("%lld%lld", &x, &y);
			add(x, y, i);
			add(y, x, i);
		} 
	}
	scanf("%lld", &k);
	for (int i = 1; i <= k; i++) {
		scanf("%lld", &b[i]); 
		a[b[i]].push_back(i);
	}
	printf("%lld\n", bfs());
	return 0;
}

2023/10/22 21:09
加载中...