ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛牛与交换排序

2021-04-10 21:31:44  阅读:170  来源: 互联网

标签:cnt 牛牛 交换 ++ st int else 排序 op


双端队列o(1)模拟区间翻转

链接

#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(0)
using namespace std;

const int N = 1e5 + 5;
bitset<N> v;

int main() {
    IO;
    int n; cin >> n;
    vector<int> a(n + 1), p(n + 1);
    deque<int> q;

    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        p[a[i]] = i;
    }

    int st = 1, k = 0;
    while (st <= n && a[st] == st) st++;

    if (st == n + 1) cout << "yes\n1" << endl;
    else {
    	//op记录从队头插入还是从队尾插入
        int op = 1, f = 1, k = abs(st - p[st]) + 1;
        for (int i = st; i <= n;) {
            if (i == a[i]) {
                i++;
                continue;
            }

			//如果一个数在他第一次翻转之后仍留在原地,则该情况不合法,体现为v[i] == 1
            if (v[i] || abs(i - p[i]) + 1 != k) {
                f = 0;
                break;
            }

            for (int j = i + q.size(); j < i + k; ++j) {
                if (op) q.push_front(a[j]);
                else q.push_back(a[j]);
                v[a[j]] = 1;
            }

            //for (auto j = q.begin(); j != q.end(); ++j) cout << (*j) << " ";cout << endl;

            if (op) {
                int cnt = 0;
                for (auto j = q.begin(); j != q.end(); ++j) {
                    if ((*j) == i) {
                        i++;
                        cnt++;
                    } else {
                        break;
                    }
                }
                while (cnt--) q.pop_front();
            } else {
                int cnt = 0;
                //这是从队尾插入的,所以要倒着遍历
                for (auto j = q.rbegin(); j != q.rend(); ++j) {
                    if ((*j) == i) {
                        i++;
                        cnt++;
                    } else {
                        break;
                    }
                }
                while (cnt--) q.pop_back();
            }
            op = !op;
        }
        if (q.size()) f = 0;
        A:
            if (f) cout << "yes\n" << k << endl;
            else cout << "no\n";
    }
    return 0;
}

标签:cnt,牛牛,交换,++,st,int,else,排序,op
来源: https://blog.csdn.net/weixin_45563175/article/details/115584382

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有