题解 CF1372C
题目
题意
给你一个 \(1\) 到 \(n\) 的排列。
定义特殊交换为:选择一段区间\([l,r]\) ,使得此段区间上的数交换后都不在原来的位置。
问最少多少次可以将此排列变成升序的。
思路
前言
将语言错选成C11,CE了!
定义
在正确的位置: 对于排列 \(T\) ,若\(T[i]=i(i\geq 1)\) ,则称 i 在正确的位置,否则,i 在错误的位置。
wrong: 整个排列错误的位置的个数。
firstw: 第一个错误的位置。
lasw: 最后一个错误的位置。
分析
我们可以发现,最多 \(2\) 次即可。
当 \(n=2\) 时, 显然最多 \(1\) 次。
当 \(n\geq2\) 时,有一个通用的解法:
设原来序列为 \(T\) , 目标的升序序列为 \(S\) 。
则我们可以选择\([1,n]\) ,第一步将 \(T\) 变成 各个位置与 \(T\) , \(S\) 不同的序列 \(K\),在 \(n\geq3\) 下,\(K\) 必定存在。
再将其变为 \(S\)。
接下来考虑能否用更少的次数,
用 0 次,则必须已经排好序。
用 1 次,则代表错误的位置连成一片,则一次即可矫正。
算法
变量含义见前文定义。
如果 没有错误 即 wrong==0 ,答案为 0
如果 有错误但错误连成一片,即\(wrong== lasw - firstw + 1\) ,则答案为 1
否则 答案为 2
代码
/*
	* Author :Werner_Yin
	* Time: 2020-07-11 23:51:29
	* I believe I can AC !
*/
#include <bits/stdc++.h>
#define lol long long
#define GDB(x) cout<<"DATA "<<#x<<" :"<<x<<endl;
#define mes(x) memset(x,0,sizeof(x))
using namespace std;
template <typename T>
void re(T &x){
	#define ge getchar()
	x = 0;int sgn = 1;char ch = ge;
	for(;!isdigit(ch);ch = ge) if(ch == '-') sgn = -1;
	for(;isdigit(ch);ch = ge) x = (x<<1)+(x<<3)+(ch^48);
	x *= sgn;
}
template <typename T>
void write(T x){
	if(x == 0) putchar(48);
	else if(x < 0) putchar('-');
	int k = 0,que[20];
	while(x > 0){
		que[++k]=x % 10;
		x /= 10;
	}
	for(int i = k;i > 0;i--) putchar(que[i] + 48);
	return;
}
const int MAXN = 1e5 + 10;
int a,wrong;
int main (){
	int T;
	re(T);
	while(T--){
		int n;
		re(n);
		wrong = 0;
		int firstw = n,lasw = 0;
		for(int i = 1;i <= n;i++) {
			re(a);
			if(i !=a ) {
				firstw = min(firstw,i);
				lasw = i;
				wrong++;
			}
		}
		int ans = 0;
		if(wrong == 0) ans = 0;
		else if(lasw - firstw + 1 == wrong) ans = 1;
		else ans = 2;
		write(ans);
	}
	return 0;
}
题解 CF1372C的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
		我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ... 
- noip2016十连测题解
		以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ... 
- BZOJ-2561-最小生成树 题解(最小割)
		2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ... 
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
		Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ... 
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
		题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ... 
- 2016ACM青岛区域赛题解
		A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ... 
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
		http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ... 
- 网络流n题 题解
		学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ... 
- CF100965C题解..
		求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ... 
随机推荐
- 富文本插件tinymce初始化配置参数说明
			{ language: _this.language, // 显示语种 selector: #${_this.tinymceId}, // 容器的id height: _this.height, // ... 
- Spring AOP学习笔记04:AOP核心实现之创建代理
			上文中,我们分析了对所有增强器的获取以及获取匹配的增强器,在本文中我们就来分析一下Spring AOP中另一部分核心逻辑--代理的创建.这部分逻辑的入口是在wrapIfNecessary()方法中紧接 ... 
- 深入理解JVM(③)虚拟机性能监控、故障处理工具
			前言 JDK的bin目录中有一系列的小工具,除了java.exe.javac.exe这两个编译和运行Java程序外,还有打包.部署.签名.调试.监控.运维等各种场景都会用到这些小工具. 这些工具根据软 ... 
- springcloud2.0 添加配置中心遇到的坑
			新手入门,在springcloud 配置config的时候遇到了几个比较烦的坑 先说1.5x版本的一些配置吧 首先是端点暴露的方式 management: security: enabled: fal ... 
- 触发器_实现ORACEL自动增长字段
			实现XX表的字段code,为自动增长字段? 1.创建一个sequence,如图: 输入如下数据: S_COUNTRY为sequence名称 2.创建一个触发器,目的是在插入数据之前插入自动增长的数字, ... 
- JavaWeb网上图书商城完整项目--day02-18.修改密码页面处理
			1.用户登陆成功之后会显示 当点击修改密码的时候,会进入下面的页面 对应的是pwd.jsp这个文件 我们把对jsp页面前段的校验都封装在pwd.js中,在jsp中引入该js文件 <%@ page ... 
- LeetCode 80,不使用外部空间的情况下对有序数组去重
			本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第49篇文章,我们一起来看LeetCode的第80题,有序数组去重II(Remove Duplicates fr ... 
- day01---学习Mysql高级性能优化1
			Mysql逻辑架构图 
- 2020年全新web前端学习路线图,学完就业20K!
			第一阶段:HTML5+css 配套学习视频: 前端小白零基础入门HTML5+CSS3 第二阶段:移动web网页开发 移动web进阶教程 第三阶段:JavaScript网页编程 前端与移动开发基础入门到 ... 
- 解决移动端点击穿透问题_h5实现移动端点击事件穿透的多种解决方案
			移动端点透点透现象出现的场景: 当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件.在这种情况下,点击A/B重叠 ... 
