Codeforces Round #732 (Div. 2) C 思维 结论 找规律

该博客讨论了一种数组操作问题,其中元素具有方向,并需要通过交换保持非递减顺序且方向朝右。关键在于理解每个元素必须被交换偶数次以保持方向不变,因此奇偶位置的元素分别排序是解决方案的关键。文章提供了一个AC代码示例,演示了如何检查这种状态是否可达。
摘要由CSDN通过智能技术生成

题目

给你一个数组A
ai代表每个元素的值,并且他们还具有方向,一开始都是朝右。
我们可以将相邻的数进行交换,但是每交换一次他们的方向会改变一次。
要求在任意次操作的情况下,能否让数组变成非递减并且方向一致朝右的情况。

题解思路

性质(突破点) : 要使方向不变必然要让这个数被交换偶数次。

要让这个数被交换偶数次。只能交换奇偶性质相同的点。
那中间的数的方向是否能保证?
例如3 2 1 交换 3 1
2 3 1 2 3
2 1 3 3 1
1 2 3 2 1
中间的数也只会被交换偶数次。即这个点被换到一个位置后需要换回来 必然是偶数次的。
所以 只需将 奇偶点分别排序

再看他们是否递增即可。

参考题解

AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long

using namespace std;

const  int  INF =  0x3f3f3f3f;
const  int N = 200100 ; 
int n ;
int a[N] ; 
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int T ;
    cin >> T ;
    while (T--)
    {
        vector <int> b1 ;
        vector <int> b2 ; 
        cin >> n ;
        for (int i = 1 ; i <= n ; i++ )
        {
            cin >> a[i] ;
            if (i%2)
                b1.push_back(a[i]);
            else
                b2.push_back(a[i]); 
        }
        if (n == 1 )
        {
            cout<<"YES\n" ; 
            continue ;
        }
        sort(b1.begin(),b1.end()) ;
        sort(b2.begin(),b2.end()) ;
        bool falg = 1 ;
        for (int i = 0 ; i < b2.size() ; i++ )
        {
            if (b2[i] < b1[i] )
                falg = 0 ;
            if (i + 1 < b1.size() && b2[i] > b1[i+1] )
                falg = 0 ; 
        }
        if (falg)
            cout << "YES\n" ;
        else
            cout << "NO\n" ; 
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值