[atARC110F]Esoswap
先构造使得$p_{i}$降序(即$p_{i}=n-1-i$),只需要从后往前,不断执行$i$操作直至合法即可
正确性的证明:首先保证了$[0,n-i)$这些数字都已经出现,因此操作不会破坏已确定的数字的顺序
同时,一个数字不会重复出现,因为若要与其交换后的位置再交换,仍需要其本身,显然不可能
(特别的,对于0由于已经会在$n-1$上出现,因此不需要考虑)
由于每一个位置上每一个数至多出现1次,因此至多$n^{2}$次操作即可
再考虑如何把顺序调回来,先将一个后缀排好,然后考虑插入一个数$i$(后缀必然是$[0,i)$)
考虑操作$p_{j}=1$的位置$j$,相当于将$j$向后挪1步,因此可以将1挪到末尾,又因为$i+p_{i}=n-1$,执行操作$i$将其与1交换,再将1与0交换即可
例如:540123->540213->540231(把1挪到末尾)->510234(执行操作$i$)->501234(将1与0交换)


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 vector<int>ans;
5 int n,a[N];
6 void write(int k){
7 ans.push_back(k);
8 swap(a[k],a[(k+a[k])%n]);
9 }
10 int main(){
11 scanf("%d",&n);
12 for(int i=0;i<n;i++)scanf("%d",&a[i]);
13 for(int i=n-1;i;i--)
14 while (a[i]!=n-i-1)write(i);
15 for(int i=n-2;i>=0;i--){
16 for(int j=i+1;j<n-1;j++)write(j);
17 write(i);
18 write(i);
19 }
20 for(int i=0;i<n;i++)assert(a[i]==i);
21 printf("%d\n",ans.size());
22 for(int i=0;i<ans.size();i++)printf("%d\n",ans[i]);
23 }
[atARC110F]Esoswap的更多相关文章
- Solution -「ARC 110F」Esoswap
\(\mathcal{Description}\) Link. 给定 \(0\sim n-1\) 的排列 \(p_{0..n-1}\),每次操作给出 \(i\),交换 \(p_i\) 和 \( ...
- world.construct(me);
目录 0 引言 0.1 所谓构造题 0.2 重点是动机 (motivation) 1 实践出真知 1.1 「CSP-S 2021」「洛谷 P7915」回文 1.1.1 题目大意 1.1.2 解题过程 ...
随机推荐
- JavaScript数组 几个常用方法
前言 数组方法有太多了,本文记录一些本人容易记错的一些数组方法,用于巩固及复习. 后续会慢慢的将其他数组方法添加进来. 善用数组方法可以使数据处理变的优雅且简单. 那下面让我们开始吧: filter( ...
- linux启动redis命令
首先进入到/usr/local/bin目录下(因为你redis安装的目录绝大多数都在这里) root@xxxx:/usr/local/bin#:redis-server wangconfig/redi ...
- SpringBoot之日志注解和缓存优化
SpringBoot之日志注解和缓存优化 日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+Aop的方式来实现日志的输出: 首先需要定义一个注解类: @ ...
- torch.nn.Sequential()详解
参考:官方文档 源码 官方文档 nn.Sequential A sequential container. Modules will be added to it in the order th ...
- 2.1 OOP & SOLID
OOP & SOLID Implementing DDD highly relies on the Object Oriented Programming (OOP) and SOLID pr ...
- 原生js-返回顶部
html部分: <body style="height:2000px"> <div id="div1"> 返回顶部 </div&g ...
- javascript-jquery对象的事件处理
一.页面加载 1.页面加载顺序:先加载<head></head>之间的内容,然后加载<body></body>之间的内容 直接在head之间书写jque ...
- 【Spring】IoC容器 - 依赖注入
前言 上一篇文章已经学习了[依赖查找]相关的知识,这里详细的介绍一下[依赖注入]. 依赖注入 - 分类 因为自己是基于小马哥的脉络来学习,并且很认可小马哥梳理的分类方式,下面按照小马哥思想为[依赖注入 ...
- 大闸蟹的项目分析——CSDN APP
大闸蟹的软件案例分析 项目 内容 这个作业属于那个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 学习软件工程的相关知识 这个作业在哪个具体方面帮我实现目标 从多角度分析软件 一 ...
- 使用nexus搭建一个docker私服
使用nexus搭建docker私服 一.需求: 二.实现步骤 1.编写`docker-compose`文件,实现`nexus`的部署 2.修改/usr/lib/systemd/system/docke ...