专栏文章

さよなら、全てのエヴァンゲリオン。

AT_arc155_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min923rn
此快照首次捕获于
2025/12/01 22:33
3 个月前
此快照最后确认于
2025/12/01 22:33
3 个月前
查看原文
宝宝分讨。
连续三个位置之和为偶数,要么没有奇数,要么恰有两个奇数。
如果任两个奇数中间都间隔至少两个偶数,那么显然无法操作到任何一个奇数,故奇数不能改变位置,只可以把相邻两个奇数之间的偶数任意重排,排序之后判断即可,注意特判相邻两个奇数之间只有两个偶数的情况,此时不能重排。
否则存在一对位置相邻的奇数可以重排邻近的三个位置,容易发现我们利用它可以在序列内任意移动,任意交换邻近的三个位置,所以我们可以任意重排奇数和偶数。特判整个序列只有两个偶数的情况,此时容易发现两个偶数之间不能交换相对顺序,因为我们只能通过直接的一次操作重排两个偶数,但是两个偶数一个奇数总和奇数不合法。
复杂度 1log。
CPP
#include <bits/stdc++.h>
#define LL long long
#define ull unsigned long long
#define uint unsigned int
using namespace std;
const int N = 2e5 + 10;
int n, A[N], B[N];
int main() {
	freopen(".in", "r", stdin); freopen(".out", "w", stdout);
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	int _ = 1;
	while (_ --) {
		cin >> n;
		for (int i = 1; i <= n; i ++) cin >> A[i];
		for (int i = 1; i <= n; i ++) cin >> B[i];
		bool flag = false;
		for (int i = 3; i <= n; i ++)
			flag |= ((A[i] + A[i - 1] + A[i - 2]) % 2 == 0 && ((A[i] & 1) || (A[i - 1] & 1) || (A[i - 2] & 1)));
		if (!flag) {
			bool Ans = true;
			vector<int> pos; pos.push_back(0);
			for (int i = 1; i <= n; i ++) if (A[i] % 2 == 1 || B[i] % 2 == 1) {
				if (A[i] != B[i]) Ans = false;
				pos.push_back(i);
			}
			pos.push_back(n + 1);
			if (Ans) {
				for (int i = 1; i < (int)pos.size(); i ++) if (pos[i] - pos[i - 1] > 3) {
					sort(A + pos[i - 1] + 1, A + pos[i]); sort(B + pos[i - 1] + 1, B + pos[i]);
				}
				for (int i = 1; i <= n; i ++) Ans &= (A[i] == B[i]);
			}
			cout << (Ans ? "Yes\n" : "No\n");
		} else {
			bool flag2 = false;
			for (int i = 3; i <= n; i ++)
				flag2 |= ((B[i] + B[i - 1] + B[i - 2]) % 2 == 0 && ((B[i] & 1) || (B[i - 1] & 1) || (B[i - 2] & 1)));
			if (!flag2) { cout << "No\n"; continue; }
			vector<int> vec1, vec2;
			for (int i = 1; i <= n; i ++) if (A[i] % 2 == 0) vec1.push_back(A[i]);
			for (int i = 1; i <= n; i ++) if (B[i] % 2 == 0) vec2.push_back(B[i]);
			sort(A + 1, A + 1 + n); sort(B + 1, B + 1 + n);
			for (int i = 1; i <= n; i ++) flag2 &= (A[i] == B[i]);
			if (vec1.size() == 2) flag2 &= (vec1[0] == vec2[0] && vec1[1] == vec2[1]);
			cout << (flag2 ? "Yes\n" : "No\n");
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...