Codeforces Round #655 (Div. 2) C
题目链接
https://codeforces.com/contest/1372/problem/C
题面
题意
给定一个长度为n(n≤2e5)n(n\leq2e5)n(n≤2e5)的数组,你可以任意选择一个区间[L,R][L,R][L,R]使得区间内的数都不在原来位置上,问使该数组从小到大排序,最少经过的次数。
思路
不难想到只有三种情况:
1:原数组本身就是从小到大,答案为000,因为不需要排序。
2:记录从左边开始第一个不在自己位置的下标为lll,从右边边开始第一个不在自己位置的下标为rrr,[l,r][l,r][l,r]都不在自己的位置上,答案为111,因为我们只需要对这部分进行一次排序即可。
3:记录从左边开始第一个不在自己位置的下标为lll,从右边边开始第一个不在自己位置的下标为rrr,[l,r][l,r][l,r]存在至少有一个数在自己的位置上,答案为222,因为我们只需要对在自己位置上的这部分进行一次排序之后再将[l,r]进行排序即可。
ps:实在不太理解可以把在自己位置的数赋值为111,不在自己位置的赋值为222,比如"52341 “->“01110”,题目要求每个位置都不在原位置,那么你肯定要一次改变连续的"111"的位置然后不管咋样乱序都可以一次变为"11111”,这样才是最小次数,又比如:“12435”->“11001”,你肯定要一次改变连续的"00"的位置为"11",正确位置,这样才是最小次数。
参考代码
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
int main() {int t, n;scanf("%d", &t);while (t--) {scanf("%d", &n);vector<int> ans(n);for (auto &a : ans) {scanf("%d", &a);a--;}if (is_sorted(ans.begin(), ans.end())) {printf("0\n");} else {int l = 0, r = n;while (l < r && ans[l] == l) {l++;}while (r > l && ans[r - 1] == r - 1) {r--;}bool f = 0;for (int i = l; i < r; i++) {if (ans[i] == i) {f = 1;break;}}printf("%d\n", f ? 2 : 1);}}return 0;
}
Codeforces Round #655 (Div. 2) C相关推荐
- Codeforces Round #655 (Div. 2) D
题目链接 https://codeforces.com/contest/1372/problem/D 题面 题意 给定n(n≤2e5)n(n\leq2e5)n(n≤2e5)个数字,组成一个环,每次你可 ...
- Codeforces Round #655 (Div. 2) A
题目链接 https://codeforces.com/contest/1372/problem/A 题面 题意 对于给定的n(n≤1000)n(n \leq1000)n(n≤1000)找一个长度为n ...
- Codeforces Round #655 (Div. 2) E. Omkar and Last Floor 区间dp + 巧妙的状态设计
传送门 题意: 思路: 按照贪心的思路来考虑的话,显然是每一列111的个数越多越好,所以我们能放到一列就放到一列.设f[l][r]f[l][r]f[l][r]为在[l,r][l,r][l,r]内,区间 ...
- Codeforces Round #655 (Div. 2) D. Omkar and Circle 思维 + 奇偶贪心
传送门 题意: 给一个长为nnn的数组(nnn为奇数),iii与i−1i-1i−1相邻,111与nnn相邻,每次选择一个位置,将这个位置的值变成与它相邻的两个位置的和,让后将相邻位置删掉.求最终剩下一 ...
- Codeforces Round #655 (Div. 2) B. Omkar and Last Class of Math 数学
传送门 题意: 找出A+B=nA+B=nA+B=n并且lcm(A,B)\operatorname{lcm}(A,B)lcm(A,B)最小的AAA和BBB. 思路: nnn为偶数的时候答案肯定为都是n ...
- Codeforces Round #655 (Div. 2) B C
代码如下: #include<iostream> #include<algorithm> #include<cstring> using namespace std ...
- Codeforces Round #655 (Div. 2)
A Omkar and Completion 只要找两个相加不等的数交叉构造即可. AC代码: int main() {int t;sd(t);while (t--){sd(n);rep(i, 1, ...
- Codeforces Round #655 (Div. 2) ABCDEF题解
题号 博客链接 cf分数 算法标签 A https://blog.nuoyanli.com/2020/07/14/codeforces-round-655-div-2-a/ 800 简单 B http ...
- Codeforces Round #655 (Div. 2) 题解
A. Omkar and Completion 查看题解 构造 B. Omkar and Last Class of Math 查看题解 数学 C. Omkar and Baseball 查看题解 思 ...
最新文章
- 【实验】配置CISCO IOS基于区域的防火墙
- 【前端芝士树】Javascript的原型与原型链
- c语言限制字符数,C语言中“不受限制”的字符串函数总结.pdf
- CCIE理论-第八篇-SD-WAN(三)+DAI(动态ARP检测)
- C++ STL vector的构造
- Java Web编程技术
- 机器学习之神经网络学习及其模型
- weblogic部署linux静默安装,Linux环境下Weblogic11g中间件-静默安装详解
- linux 系统 cp: omitting directory 问题解决
- 微信商户转账到银行卡
- 毕业论文/分页符/段前2行没用
- 合天网安《Weekly CTF》第四周
- python docx首行缩进两字符的设定方法
- 解决Windows 10 无法安装.msi文件的办法
- dependencyManagement和dependencies区别
- 机器人鸣人是哪一集_博人传鸣人出场集数 博人传佐助哪几集出现过
- 企业邮箱登录地址,邮箱登录入口,邮箱登录须知
- 一文了解 DoH(DNS-over-HTTPS)和DoT(DNS-over-TLS)
- 2020年4月20日 星期一 晴 晚餐
- 【2022.1】触控板可以点击但无法滑动ThinkPad一个驱动问题