咕了好久。

A. Alexey and Train

奇怪的模拟。略。

全部代码请看:Codeforces/CF1501/CF1501B.cpp

B. Napoleon Cake

略。

全部代码请看:Codeforces/CF1501/CF1501B.cpp

C. Going Home

给定一个数组,请给出是否存在四元组使得

$$ a_w + a_v = a_x + a_y $$

分析

这题很诈骗。注意到 $x+y$ 最多只有 $5 \times 10^6$ 种情况,暴力即可。

int main() {
	int n;
	cin >> n;
	vector<int> a(n);
	for (auto &ai : a) {
		cin >> ai;
	}
	vector<pii> u(N + 1);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < i; j++) {
			int sum = a[i] + a[j];
			if (u[sum] != pii{0, 0}) {
				auto [x, y] = u[sum];
				if (x == i || x == j || y == i || y == j)
					continue;
				printf("YES\n%d %d %d %d", x + 1, y + 1, i + 1, j + 1);
				exit(0);
			}
			u[sum] = {i, j};
		}
	}
	printf("NO");
	return 0;
}

全部代码请看:Codeforces/CF1501/CF1501C.cpp

D. Two chandeliers

给定两个序列 $\{a_i\}, \{b_i\}$,分别长 $n$ 和 $m$。令无限序列 $\{A_i\}, \{b_i\}$ 是其不断循环。

问第 $k$ 对 $A_i \neq B_i$ 在哪个位置。

分析

考察其相同时刻,显然 $\operatorname{lcm}(n, m)$ 是一个周期,而在一个周期内至多只有 $\min(n, m)$ 次相同。

因此可以用桶得到两个相同的位置 $x, y$,再通过 excrt(我的板子还不知道为啥假了)解方程

$$ p \equiv x \pmod n, p \equiv y \pmod m $$

可以反推出位置 $p$。最后考虑二分答案即可。

int main() {
	ll n, m, k;
	cin >> n >> m >> k;
	vector<int> a(n), b(m);
	for (auto &ai : a) {
		cin >> ai;
	}
	for (auto &bi : b) {
		cin >> bi;
	}
	ll cyc = n * m / std::__gcd(n, m);
	vector<int> tong(2 * (n + m + 1), -1);
	for (int i = 0; i < n; i++) {
		tong[a[i]] = i;
	}
	vector<ll> pos;
	for (int i = 0; i < m; i++) {
		int num = tong[b[i]];
		if (num == -1)
			continue;
		ll p = excrt({num, i}, {n, m});
		if (p != -1)
			pos.push_back(p);
	}
	sort(pos.begin(), pos.end());
	auto get = [&](ll p) -> ll {
		if (pos.empty())
			return 0;
		ll rem = p % cyc;
		ll sum = lower(1, pos.size(), [&](int i) {
			return pos[i - 1] <= rem;
		});
		return p / cyc * pos.size() + sum;
	};
	cout << upper(1, 1E18, [&](ll x) {
		return x - get(x - 1) >= k;
	});

	return 0;
}

全部代码请看:Codeforces/CF1501/CF1501D.cpp