vlaqa,WA test #5 求助 /kel
查看原帖
vlaqa,WA test #5 求助 /kel
322620
Nygglatho楼主2024/9/27 14:56

rt. 可以给组 hack 吗,自己拍了没拍出来(

#include "bits/stdc++.h"
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long

#define OPEN freopen (".in", "r", stdin); freopen (".out", "w", stdout);
#define DATA freopen (".in", "w", stdout);

#define pc __builtin_popcount
#define db double
#define pii pair<int, int>
#define fi first
#define se second

#define F(i,x,y) for (int i = (x); i <= (y); ++i)
#define D(i,x,y) for (int i = (x); i >= (y); --i)

using namespace std;

const ll inf = 1ll * 1e18;
const ll mod = 998244353ll;
//const ll mod = 1ll * 1e9 + 7ll;

namespace FastIO {
	inline void Rd(int& x) {
		int f = 1;
		x = 0;
		char c = getchar();
		while (c < '0' || c > '9') {
			if (c == '-') f = -1;
			c = getchar();
		}
		while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c - 48), c = getchar();
		x *= f;
	}

	inline void Wt(int x) {
		if (x < 10) {
			putchar(x + 48);
			return;
		}
		Wt(x / 10);
		putchar((x % 10) + 48);
	}
}

namespace Maths {
	ll fac[560000];

	void init() {

		fac[0] = 1ll;

		F(i, 1, 500000) fac[i] = fac[i - 1] * i % mod;
	}

	ll qpow(ll x, ll y) {
		if (y == 0ll) return 1ll;

		ll w = qpow(x, y / 2ll);

		if (y % 2ll) return (w * w % mod) * x % mod;
		else return w * w % mod;
	}

	inline ll C(ll x, ll y) {
		return (fac[x] * qpow(fac[y], mod - 2ll) % mod) * qpow(fac[x - y], mod - 2ll) % mod;
	}

	inline ll div(ll x) {
		return qpow(x, mod - 2ll);
	}
}

int n, m;

ll ans = 0ll;

struct Edge {
	int to, nxt, dis;
};

struct Graph {
	Edge e[1300000];
	int hd[310000];
	int cnt;

	int vis[310000];

	ll dis[310000];
	int dep[310000];

	void Addedge (int x, int y, int d) {
		++ cnt;
		e[cnt].to = y;
		e[cnt].dis = d;
		e[cnt].nxt = hd[x]; hd[x] = cnt;
	}

	void Dfs (int now) {
		vis[now] = 1;
		for (int i = hd[now]; i; i = e[i].nxt) {
			if (! vis[e[i].to]) Dfs (e[i].to);
		}
	}

	void Tarjan (int now) {
		for (int i = hd[now]; i; i = e[i].nxt) {
			int v = e[i].to, d = e[i].dis;
			if (! vis[v]) {
				vis[v] = 1; dis[v] = dis[now] + d;
				dep[v] = dep[now] + 1;
				Tarjan (v);
			} else {
				if (dep[v] < dep[now]) {
					// cerr << "L117 " << now << ' ' << v << ' ' << d << ' ' << 1ll * abs(dis[now] - dis[v] + d) << '\n';
					ans = __gcd (ans, 1ll * abs(dis[now] - dis[v] + d));
				}
			}
		}
	}
}e1, e2, e3;

int a[310000];

int main() {
	// OPEN
	// IOS

	cin >> n >> m;

	F(i, 1, m) {
		int u, v;
		cin >> u >> v;
		e1.Addedge(u, v, 1);
		e2.Addedge(v, u, 1);
	}

	e1.Dfs(1);
	e2.Dfs(n);

	F(i, 1, n) cin >> a[i];

	F(i, 1, n) {
		if (! e1.vis[i] || ! e2.vis[i]) continue;
		if (a[i] != -1) e3.Addedge(i, i + n, a[i]);
		if (a[i] != -1) e3.Addedge(i + n, i, -a[i]);
		for (int j = e1.hd[i]; j; j = e1.e[j].nxt) {
			int v = e1.e[j].to;
			if (! e1.vis[v] || ! e2.vis[v]) continue;
			e3.Addedge (i + n, v, 0);
			e3.Addedge (v, i + n, 0);
		}
	}

	e3.Addedge (1, n << 1, 0);
	e3.Addedge (n << 1, 1, 0);

	F(i, 1, n) {
		if (! e1.vis[i] || !e2.vis[i] || e3.vis[i]) continue;
		e3.Tarjan (i);
	}

	F(i, n + 1, n << 1) {
		if (! e1.vis[i - n] || !e2.vis[i - n] || e3.vis[i]) continue;
		e3.Tarjan (i);
	}

	if (ans == 0ll) cout << "-1\n";
	else cout << ans << '\n';
}
2024/9/27 14:56
加载中...