专栏文章
题解:AT_arc203_b [ARC203B] Swap If Equal Sum
AT_arc203_b题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioi3rfp
- 此快照首次捕获于
- 2025/12/02 19:34 3 个月前
- 此快照最后确认于
- 2025/12/02 19:34 3 个月前
一道十分有趣的题,建议自己想出来而不是看题解,因为看题解之后就会失去它绝大部分的快乐。
首先先判断是否相等,再判断最终能否到达相等的局面,这是平凡的。
我们需要发现一个十分有趣的交换方式:一个区间单取一个 ,另一个区间取一个 和它前面或后面的连续的一段 。这个操作能让你在两个 之间随便移动 。所以只要有两个 就能轻松转换。
随后我们考虑只有一个 的情况。现在我们只有一个 ,不能再使用上面的那个把戏了。没关系,我们还能再发现新的交换方式。
我们可以令一个区间单取一个 ,另一个区间取任意个 。这种操作可以将任意个 移动到另一个有 的位置。所以,只要这个恼人的 不在序列的开头或结尾,那我们就能将一侧的 移动到另一侧使得两侧的 数量相等。
代码就是把这个照着写一遍。
CPP// Problem: B - Swap If Equal Sum
// Contest: AtCoder - AtCoder Regular Contest 203 (Div. 2)
// URL: https://atcoder.jp/contests/arc203/tasks/arc203_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define itn int
bool startmb;
constexpr int N=2e5+5;
int _,n,sum,a[N],b[N];
bool endmb;
main()
{
cin.tie(0)->sync_with_stdio(false);
cin>>_;
while(_--)
{
cin>>n;
int suma=0,sumb=0;
for(int i=1;i<=n;i++) cin>>a[i],suma+=a[i];
for(int i=1;i<=n;i++) cin>>b[i],sumb+=b[i];
bool flag=1;
for(int i=1;i<=n;i++) if(a[i]!=b[i]) flag=0;
if(flag==1) cout<<"Yes\n";//不需要交换
else if(suma==sumb)
{
if(suma>=2) cout<<"Yes\n";//1的个数大于等于2
else
{
bool flag=1;
for(int i=1;i<=n;i++) if(a[i]==1) if(i==1||i==n) flag=0;
for(int i=1;i<=n;i++) if(b[i]==1) if(i==1||i==n) flag=0;
//判断1的位置
if(flag) cout<<"Yes\n";
else cout<<"No\n";
}
}
else cout<<"No\n";//无法相同
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...