1 条题解

  • 0
    @ 2026-5-5 23:14:08

    关键思路

    如果至少存在一个类型为 00 的元素并且至少存在一个类型为 11 的元素,那么我们总是可以对数组进行排序

    解法

    • 如果所有元素都属于同一类型,则无法交换任意两个元素。此时,我们只需检查给定的元素是否已经按非递减顺序排列。

    • 否则,至少存在一个类型为 00 的元素和至少一个类型为 11 的元素。在这种情况下,可以交换任意两个元素!我们可以仅用一次操作交换两个不同类型的元素。假设我们想交换两个相同类型 aabb 的元素,可以通过 33 次操作完成:

      1. 选择一个类型与 aabb 不同的元素 cc
      2. 先交换 aacc
      3. 再交换 bbcc
      4. 最后交换 aacc

      这样操作之后,cc 回到初始位置,而 aabb 被交换了。这实际上就是使用一个临时变量来交换两个整数的方法。

      由于我们可以交换任意两个元素,在这种情况下,总能对数组进行排序

    时间复杂度O(n)O(n)

    #include <bits/stdc++.h>
    using namespace std;
     
    #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #define endl "\n"
    #define int long long
    
    const int N = 1e3 + 5;
    
    int n;
    int a[N], b[N];
    
    int32_t main()
    {
    	IOS;
    	int t;
    	cin >> t;
    	while(t--)
    	{
    		cin >> n;
    		bool sorted = 1, have0 = 0, have1 = 0;
    		for(int i = 1; i <= n; i++)
    		{
    			cin >> a[i];
    			if(i >= 2 && a[i] < a[i - 1])
    				sorted = 0;
    		}
    		for(int i = 1; i <= n; i++)
    		{
    			cin >> b[i];
    			if(!b[i])
    				have0 = 1;
    			else
    				have1 = 1;
    		}
    		if(have0 && have1)
    			cout << "Yes" << endl;
    		else if(sorted)
    			cout << "Yes" << endl;
    		else
    			cout << "No" << endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6978
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者