专栏文章
CF2117E 题解
CF2117E题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip15ee6
- 此快照首次捕获于
- 2025/12/03 04:27 3 个月前
- 此快照最后确认于
- 2025/12/03 04:27 3 个月前
前言
目前的题解都是只说结论,我来证明一下。
首先,观察题面:
可以进行一次删除操作。
选取 ,然后使得 或 。
首先,观察题面:
可以进行一次删除操作。
选取 ,然后使得 或 。
结论
当 时,答案为 。
否则,答案为最大的下标 满足 或 或 或 在 (不包括 )后出现过。
否则,答案为最大的下标 满足 或 或 或 在 (不包括 )后出现过。
证明
情况 :有一个下标 使得 。
此时我们可以交替赋值:
,这样答案就是 了。
此时我们可以交替赋值:
,这样答案就是 了。
情况 :有一个下标 使得 。
赋值一次就变成情况 了。
赋值一次就变成情况 了。
情况 : 在 的后面(不包括 )出现过。
分讨。假设出现过的这个数的下标为 。
分讨。假设出现过的这个数的下标为 。
- , 为偶数。手推一下,发现此时不断赋值最终会变成情况 。
- , 为奇数。怎么办呢?别忘了,还有一个条件没用:可以进行一次删除操作。 于是我们进行一次删除操作, 就变成偶数了。
- , 为奇数。仍然是不断赋值。
- , 为偶数。可以进行一次删除操作。 仍然是删除一次, 就变成奇数了。
这时有人就要问了:为什么是 的后面而不是 的后面呢?
如果是 的后面(不包括 ),那么 1. 和 2. 在 情况下就是情况 ,3. 在 情况下不满足 为奇数,4. 在 情况下无解,所以还是相当于在 的后面,还得做特判,过于麻烦。
如果是 的后面(不包括 ),那么 1. 和 2. 在 情况下就是情况 ,3. 在 情况下不满足 为奇数,4. 在 情况下无解,所以还是相当于在 的后面,还得做特判,过于麻烦。
代码
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;
}
提交记录
码字不易,求赞 qwq。
码字不易,求赞 qwq。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...