CF1365B题解

这题看上去很吓人,没问题,大家跟着我一起懵逼!

不过我们先看看这题的翻译……

这题有两个序列,分别为 a,ba,b

bb 是属性值,只有 0,1{0,1} 两种选择;ai105a_i\leq 10^5

很明显,这题如果从 aa 入手很有可能会 TLE\operatorname{TLE},所以,我们从bb 开始入手。

我们来看看这条条件:

  • 只有两个属性值不同才可以交换。

那么……我们先考虑一种特殊情况。

a=1,0,8,5,3,7a={1,0,8,5,3,7}b=1,1,1,1,1,1b={1,1,1,1,1,1}

这种情况无论你怎么办,都无法交换 aa 中任何一个元素。

aa 中元素有下降的,所以一定会失败。

bb 中元素全变为 00 也一样,会失败。

这种情况下,只有 aa 自己不下降,才能成功。

那如果是这种情况呢?

a=6,5,4,3,2,1a={6,5,4,3,2,1}b=1,0,0,0,0,0b={1,0,0,0,0,0}

很明显,我们只有 a1(6)a_1(6) 的属性值不同,所以我们必须通过 b1b_1 交换。

那我们完全可以交换成这样:

a=1,5,4,3,2,6a={1,5,4,3,2,6}b=0,0,0,0,0,1b={0,0,0,0,0,1}

然后:

a=1,2,3,4,5,6a={1,2,3,4,5,6}b=0,0,0,0,0,1b={0,0,0,0,0,1}

完成!

所以,只要 bb 中有 00 还有 11,无论如何都会成功。

那么代码显而易见:

#include<iostream>
using namespace std;
int a[501],b[501],n,t;
int main(){
	cin>>t;
	for(;t;t--){
		cin>>n;
		int f0=0,f1=0;
		for(int i=1;i<=n;i++)cin>>a[i];
		for(int i=1;i<=n;i++){
			cin>>b[i];
			if(b[i]==0)f0=1;
			else f1=1;
		}
		if(f0&&f1){
			cout<<"Yes\n";
		}
		else{
			int f=1;
			for(int i=1;i<=n;i++){
				if(a[i-1]>a[i]){
					cout<<"No\n";
					f=0;
					break;
				}
			}
			if(f)cout<<"Yes\n";
		}
	}
	return 0;
}

共建文明洛谷,请勿抄题解~

感谢各位在评论区 hack 的大佬们~

posted @   Weslie_qwq  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示