题解CF1375D Replace by MEX
时间:2021-08-28
本文章向大家介绍题解CF1375D Replace by MEX,主要包括题解CF1375D Replace by MEX使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
又是一道构造题,题目所求的是一个单调不降序列,并且要用不超过 \(2n\) 的操作,
咋一眼看上去似乎没什么思路,但我们可以尝试一种构造方案,那就是令 \(a_i=i-1\),这样的话这个序列就是一个单调上升的序列,满足题目要求,那么接下来的问题就是如何在 \(2n\) 次操作内转化成这个序列,对于一个序列若他不满足 \([0,n-1]\) 的数都只出现了一次,那么它的mex必然在 \([0,n-1]\) 内,那么我们可以直接枚举 \(n\) 次mex,每次对mex+1的位置的数使用操作,这样就能在 \(n\) 次内得到一个 \([0,n-1]\),都只出现了一次的序列,但它不一定满足上面的那个性质,所以对于每一个 \(a_i=k\ne i-1\),对它使用一次操作 \(a_i=n\),然后再对 \(k-1\) 使用使用一次操作 \(a_{k-1}=k\),如此循环,那么这个序列就能满足上面的条件了,并且操作数不会多于 \(2n\)。
代码
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
vector<int> ans;
int a[1005], tim[1005];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(tim, 0, sizeof(tim));
ans.clear();
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
tim[a[i]]++;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < n; j++)
{
if (!tim[j])
{
ans.push_back(j + 1);
tim[a[j + 1]]--;
a[j + 1] = j;
tim[j]++;
break;
}
}
}
for (int i = 1; i <= n; i++)
{
if (a[i] != i - 1)
{
int k = a[i] + 1;
ans.push_back(i);
a[i] = n;
while (a[k] != k - 1 && k - 1 != n)
{
ans.push_back(k);
int tmp = k;
k = a[k] + 1;
a[tmp] = tmp - 1;
}
}
}
printf("%d\n", ans.size());
for (int i = 0; i < ans.size(); i++)
printf("%d ", ans[i]);
printf("\n");
}
}
原文地址:https://www.cnblogs.com/A2484337545/p/15200354.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【动手学深度学习笔记】之多层感知机(MLP)
- 【动手学深度学习笔记】之线性回归
- 【动手学深度学习笔记】之PyTorch实现softmax回归
- 三分钟解决Fashion-MNIST无法下载的问题
- 【动手学深度学习笔记】之实现softmax回归模型
- python实现简单爬虫功能
- Python 爬虫入门—— IP代理使用
- Python爬虫入门:爬取pixiv
- Linux PID 一网打尽
- 使用libimobiledevice&ifuse提取iOS沙盒文件
- 你不知道的LinkedList(二):LinkedList的增删操作真的会比ArrayList快吗
- jupyter notebook中的魔法命令%run和%timeit
- js 常用正则
- 非常实用的 Python 技巧
- JavaScript中arguments