专栏文章

CF2117E 题解

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

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mip15ee6
此快照首次捕获于
2025/12/03 04:27
3 个月前
此快照最后确认于
2025/12/03 04:27
3 个月前
查看原文

前言

目前的题解都是只说结论,我来证明一下。
首先,观察题面:
可以进行一次删除操作。
选取 ii,然后使得 ai=bi+1a_i = b_{i + 1}bi=ai+1b_i = a_{i + 1}

结论

an=bna_n = b_n 时,答案为 nn
否则,答案为最大的下标 ii 满足 ai=bia_i = b_iai=ai+1a_i = a_{i + 1}bi=bi+1b_i = b_{i + 1}ai(bi)a_i(b_i)i+1i + 1 (不包括 i+1i + 1)后出现过。

证明

情况 11:有一个下标 ii 使得 ai=bia_i = b_i
此时我们可以交替赋值:
ai1=bi,bi1=ai,ai2=bi1,bi2=ai1a_{i - 1} = b_i,b_{i - 1} = a_i,a_{i - 2} = b_{i - 1},b_{i - 2} = a_{i - 1}\dots,这样答案就是 ii 了。
情况 22:有一个下标 ii 使得 ai=ai+1(bi=bi+1)a_i = a_{i + 1}(b_i = b_{i + 1})
赋值一次就变成情况 11 了。
情况 33ai(bi)a_i(b_i)i+1i + 1 的后面(不包括 i+1i + 1)出现过。
分讨。假设出现过的这个数的下标为 jj
  1. ai=aj(bi=bj)a_i = a_j(b_i = b_j)ji+1j - i + 1 为偶数。手推一下,发现此时不断赋值最终会变成情况 11
  2. ai=aj(bi=bj)a_i = a_j(b_i = b_j)ji+1j - i + 1 为奇数。怎么办呢?别忘了,还有一个条件没用:可以进行一次删除操作。 于是我们进行一次删除操作,ji+1j - i + 1 就变成偶数了。
  3. ai=bj(bi=aj)a_i = b_j(b_i = a_j)ji+1j - i + 1 为奇数。仍然是不断赋值。
  4. ai=bj(bi=aj)a_i = b_j(b_i = a_j)ji+1j - i + 1 为偶数。可以进行一次删除操作。 仍然是删除一次,ji+1j - i + 1 就变成奇数了。
这时有人就要问了:为什么是 i+1i + 1 的后面而不是 ii 的后面呢?
如果是 ii 的后面(不包括 ii),那么 1. 和 2. 在 j=i+1j = i + 1 情况下就是情况 22,3. 在 j=i+1j = i + 1 情况下不满足 ji+1j - i + 1 为奇数,4. 在 j=i+1j = i + 1 情况下无解,所以还是相当于在 i+1i + 1 的后面,还得做特判,过于麻烦。

代码

CPP
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
ll T, n, a[200010], b[200010];
bool vis[200010]; 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> T;
	while(T--){
		memset(vis, 0, sizeof vis);
		cin >> n;
		for(ll i = 1; i <= n; i++) cin >> a[i];
		for(ll i = 1; i <= n; i++) cin >> b[i];
		if(a[n] == b[n]){
			cout << n << endl; continue;
		}
		ll mx = 0;
		for(ll i = n - 1; i > 0; i--){
			if(a[i] == b[i] || a[i + 1] == a[i] || b[i + 1] == b[i] || vis[a[i]] || vis[b[i]]){
				mx = i; break;
			}
			vis[a[i + 1]] = vis[b[i + 1]] = 1;
		}
		cout << mx << endl;
	}
	return 0;
}
提交记录 326213467326213467
码字不易,求赞 qwq。

评论

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

正在加载评论...