题目链接:https://codeforces.com/contest/1372/problem/C

题意

给出一个大小为 $n$ 的排列,每次操作可以选取一个连续子数组任意排列其中的元素,要求每个元素的位置必须与操作前不同,问将排列排为升序至少需要操作多少次。

题解

最多需要操作 $2$ 次,之后判断能否操作更少次即可。

如果已为升序,则不需要操作。

如果只有一个连续区间不为升序,如 $1,3,2,4,5$,只需要操作 $1$ 次。

否则需要操作 $2$ 次。

证明

第一次:选取整个数组,将所有 $a_i = i$ 的视为一体,在这个整体中每个元素循环右移一位,将余下 $a_i \neq i$ 的元素各自归位后也视为一体,在这个整体中的每个元素也循环右移一位。

第二次:选取整个数组,将第一次的两个整体中的元素各自循环左移一位。

代码

#include <bits/stdc++.h>
using namespace std; void solve() {
int n; cin >> n;
int a[n + 1] = {};
for (int i = 1; i <= n; i++)
cin >> a[i];
vector<int> v;
for (int i = 1; i <= n; i++)
if (a[i] != i)
v.push_back(i);
bool one_seg = true;
for (int i = 1; i < v.size(); i++)
if (v[i] - v[i - 1] > 1)
one_seg = false;
if (is_sorted(a + 1, a + 1 + n))
cout << 0 << "\n";
else if (one_seg)
cout << 1 << "\n";
else
cout << 2 << "\n";
} int main() {
int t; cin >> t;
while (t--) solve();
}

最新文章

  1. mysql 报错max_allowed_packet处理办法
  2. 三、基础功能模块,用户类别管理——锁、EF并发处理、领域服务、应用服务的划分
  3. 显式Intent和隐式Intent
  4. IOS推荐学习网站
  5. Xcode 8:在 Active Compilation Conditions 中自定义环境变量
  6. 使用VS2015(c#)进行单元测试,显示测试结果与查看代码覆盖率
  7. HDU 4483 Lattice triangle(欧拉函数)
  8. Android开发之单例模式
  9. 1613. For Fans of Statistics(STL)
  10. 配置struts tags 输出HTML
  11. 新的疑问(未解决):VC项目的配置,不是都能在Project -- Properties里设置解决的
  12. duilib DirectUI库里面的一个简单的例子RichListDemo
  13. STL&quot;源码&quot;剖析
  14. python 用嵌套列表做矩阵加法
  15. Javascript模块化简史
  16. 使用Vuex心得
  17. Java8之lambda表达式
  18. C#黎明前的黑暗
  19. 31 位域、空类的sizeof值
  20. PHP策略模式demo

热门文章

  1. [日常填坑系列]CAP食用指南-版本引用问题
  2. 【SpringMVC】SpringMVC 入门
  3. c++ 参数传递与返回值详解(reference)
  4. 为啥使用innodb_flush_method=o_direct 就能减轻io压力呢
  5. CTFshow-萌新赛逆向_签退
  6. ABAP-ALV-如何去掉OO方法中的ALV的标准按钮
  7. CSS响应式布局学习笔记(多种方法解决响应式问题)
  8. QQ刷屏助手
  9. 华为三层交换机限制vlan段的指定端口
  10. Optimal asymmetric encryption padding 最优非对称加密填充(OAEP)