zoukankan      html  css  js  c++  java
  • [CF1372C] Omkar and Baseball

    [CF1372C] Omkar and Baseball - 构造

    Description

    给你一个 (1)(n) 的排列。选择一段区间 ([l,r]),使得此段区间上的数交换后都不在原来的位置。问最少多少次可以将此排列变成升序的。

    Solution

    如果一个位置 i 满足 ai=i,那么我们说,这个位置是好的

    显然答案不会超过 2,第一步全部打乱,第二步全部归位

    如果所有位置都是好的,那么显然不需要进行任何操作

    如果存在一个区间没有位置是好的,其它位置都是好的,那么显然可以通过一次交换结束

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int t;
        cin >> t;
    
        while (t--)
        {
            int n;
            cin >> n;
    
            vector<int> a(n + 2);
            for (int i = 1; i <= n; i++)
                cin >> a[i];
    
            int flag = 0;
            for (int i = 1; i <= n; i++)
            {
                if (flag == 0 && a[i] != i)
                    flag = 1;
                if (flag == 1 && a[i] == i)
                    flag = 2;
                if (flag == 2 && a[i] != i)
                    flag = 3;
            }
    
            if (flag == 3)
                cout << 2 << endl;
            else if (flag == 0)
                cout << 0 << endl;
            else
                cout << 1 << endl;
        }
    }
    
  • 相关阅读:
    无题
    【HNOI 2002 】营业额统计
    P1589
    【网络流24题】最长递增子序列
    【NOI2008】志愿者招募
    【NOI2015】软件包管理器
    P1347
    【BZOJ 3262三维偏序】陌上花开
    数论六·模线性方程组
    数论五·欧拉函数
  • 原文地址:https://www.cnblogs.com/mollnn/p/14438181.html
Copyright © 2011-2022 走看看