2021牛客寒假算法基础集训营2 F. 牛牛与交换排序(思维题、deque)

牛牛与交换排序

https://ac.nowcoder.com/acm/contest/9982/F

Description

图片说明

Solution

数据强度可能不够大,不能保证我的写法是完全正确,不过主要是学会用 模拟实现翻转。
对于本题,我们需要找到一个符合条件的 ,随后利用 实现 的翻转。

找到合适的 ,由限制条件 得到启发,最小的不在自己位置的数字一定是最先处理的。不妨找到第一个不在自己位置的数字 ,令
接下来讲一讲如何实现 模拟区间翻转:

  • 维护一个长度为 的双端队列
  • 用一个变量记录翻转次数,如果翻转次数为偶数,在前面插入,否则在后面插入
  • 使用滑动窗口的思想,如果翻转次数为偶数,要从前面插入,所以弹出队尾的数字,否则弹出队首的数字。
  • 最后对于无法翻转的数字再逐一检验。

Code

#include <bits/stdc++.h>
#pragma GCC optimize(3)
typedef long long ll;
using namespace std;

const int N = 4e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

void solve() {
  int n; cin >> n;
  vector<int> a(n + 1, 0), pos(n + 1, 0);
  for(int i = 1; i <= n; i++) {
    cin >> a[i];
    pos[a[i]] = i; // 记录位置
  }  
  int k = 1, cur = 1; 
  for(int i = 1; i <= n; i++) {
    if(pos[i] != i) {
      k = abs(pos[i] - i) + 1; // 找到k, 第一个不在自己位置的数字
      cur = i;
      break;
    }
  }
  deque<int> q;
  for(int i = cur; i <= cur + k - 1; i++) {
    q.push_back(a[i]);
  }
  int flag = 0; // 判断是放前面还是后面
  for(int i = cur; i + k - 1 <= n; i++) {
    // i + k - 1 <= n 可翻转
    if(q.front() != i && q.back() != i) { // 翻转了也实现不了
      cout << "no\n";
      return ;
    }
    if(!flag && q.front() != i) { // 需要翻转
      flag ^= 1;
    } else if(flag && q.back() != i) { // 需要翻转
      flag ^= 1;
    }
    if(!flag) { // 插入队尾
      q.pop_front();
      if(i + k <= n) {
        q.push_back(a[i + k]);
      }
    } else { // 插入队首
      q.pop_back();
      if(i + k <= n) {
        q.push_front(a[i + k]);
      }
    }
  }
  for(int i = n - k + 2; i <= n; i++) { // 最后对于无法翻转的数字再逐一检验。
    int now;
    if(!flag) {
        now = q.front();
        q.pop_front();
    } else {
        now = q.back();
        q.pop_back();
    }
    if(now != i) {
        cout << "no\n";
        return ;
    }
  }
  cout << "yes\n";
  cout << k << '\n';

}
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  int T = 1; //cin >> T;
  while(T--) {
    solve();
  }
  return 0;
} 
全部评论

相关推荐

UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10491次浏览 92人参与
# 你的实习产出是真实的还是包装的? #
1855次浏览 42人参与
# 米连集团26产品管培生项目 #
5937次浏览 215人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7561次浏览 43人参与
# 简历第一个项目做什么 #
31664次浏览 335人参与
# 重来一次,我还会选择这个专业吗 #
433439次浏览 3926人参与
# 巨人网络春招 #
11324次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187103次浏览 1122人参与
# 牛客AI文生图 #
21422次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152348次浏览 888人参与
# 研究所笔面经互助 #
118898次浏览 577人参与
# 简历中的项目经历要怎么写? #
310217次浏览 4210人参与
# AI时代,哪些岗位最容易被淘汰 #
63642次浏览 822人参与
# 面试紧张时你会有什么表现? #
30505次浏览 188人参与
# 你今年的平均薪资是多少? #
213074次浏览 1039人参与
# 你怎么看待AI面试 #
180035次浏览 1255人参与
# 高学历就一定能找到好工作吗? #
64324次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76485次浏览 374人参与
# 我的求职精神状态 #
448043次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363373次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160638次浏览 1111人参与
# 校招笔试 #
470875次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务