ARC121C

news/2025/3/17 14:40:10/文章来源:https://www.cnblogs.com/incra/p/18776818

Sol

机房大佬 @wmrqwq 讲了这题,感觉实现很巧妙,遂来写篇题解。

不难发现 \(n\le 3\) 一定有解,这对后面做法很有帮助。

本人的思路是把 \(1\sim 3\) 移到前三个,然后后面可以冒泡排序,对于奇偶不符的可以在前面消耗一次操作。

但是这种做法有个瑕疵:就是 \(n\) 较小的时候不方便实现。

注意到从 \(n\)\(4\) 每一个按序移到答案的位置一定同样满足条件。考虑如何处理奇偶不符的问题:直接在 \(1\sim 4\) 中选择一个下标交换,不难发现一定能找到一个下标满足条件。

更多细节可以看看代码,感谢 @wmrqwq 对本人写代码的帮助!

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define pf push_front
#define desktop "C:\\Users\\incra\\Desktop\\"
#define IOS ios :: sync_with_stdio (false),cin.tie (0),cout.tie (0)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> PII;
const int dx[] = {1,0,-1,0},dy[] = {0,-1,0,1};
template <typename T1,typename T2> bool tomax (T1 &x,T2 y) {if (y > x) return x = y,true;return false;
}
template <typename T1,typename T2> bool tomin (T1 &x,T2 y) {if (y < x) return x = y,true;return false;
}
LL power (LL a,LL b,LL p) {LL ans = 1;while (b) {if (b & 1) ans = ans * a % p;a = a * a % p;b >>= 1;}return ans;
}
int fastio = (IOS,0);
#define endl '\n'
#define puts(s) cout << (s) << endl
const int N = 510;
int n;
int a[N],b[N];
vector <int> ans;
void opt (int x) {swap (a[x],a[x + 1]);swap (b[a[x]],b[a[x + 1]]);ans.pb (x);
}
void solve (int tmp) {while (1) {bool f = 1;for (int i = 1;i <= 3;i++) f &= a[i] == i;if (f) break;if (!tmp) opt (2);else opt (1);tmp ^= 1;}
}
void mian () {ans.clear ();cin >> n;for (int i = 1;i <= n;i++) cin >> a[i],b[a[i]] = i;if (n == 1) {puts ("0");return ;}if (n == 2) {if (a[1] > a[2]) puts ("1\n1");else puts ("0");return ;}if (n == 3) {solve (1);cout << ans.size () << endl;for (int i : ans) cout << i << ' ';cout << endl;return ;}int tmp = 1;for (int i = n;i >= 4;i--) {if (b[i] % 2 == tmp) {for (int j = b[i];j <= i - 1;j++) opt (j),tmp ^= 1;continue;}if (tmp) {if (a[1] != i && a[2] != i) opt (1);else opt (3);}else {if (a[2] != i && a[3] != i) opt (2);else opt (4);}tmp ^= 1;for (int j = b[i];j <= i - 1;j++) opt (j),tmp ^= 1;}solve (tmp);cout << ans.size () << endl;for (int i : ans) cout << i << ' ';cout << endl;
}
int main () {int T = 1;cin >> T;while (T--) mian ();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的基础之标识符

标识符的注意点:关键字:数据类型:

智能增长引擎:纷享销客ShareAI产品白皮书(2025版)正式发布!

作为中国SaaS CRM领域连续五年稳居增速市场第一的国产CRM领先品牌,纷享销客一直在探索AI+CRM领域的数字化变革。 2024年7月,纷享AI正式发布,开启智能CRM新纪元。同年,纷享销客《AI+CRM,赋能企业高质量增长橙皮书》重磅推出,首次站在全行业视角,阐述了AI+CRM的建设策略、…

phos 的 checkpoint

我们继续追踪 pos_cli --dump --dir /root/ckpt --pid [your program pid] 的checkpoint阶段 phos的checkpoint在handle_dump函数(pos/cli/src/dump.cpp)中实现 函数开始阶段定义各种变量和初始化我们先来看--pid 在识别到clio.action_type == kPOS_CliMeta_Pid后,我们来到规则…

数据库原理复习

自用数据库原理复习数据库复习 第一章 数据库发展史 1、数据管理技术的发展(特点) 人工管理阶段,文件系统阶段,数据库技术,文件系统的缺陷(数据冗余性,数据不一致性、数据联系弱) 2、数据库技术的产生 进入数据库阶段的标志是20世纪60年代末的三件大事 1968年IBM公司研…

碰撞检测

碰撞产生的必要条件是两个物体都有碰撞器(Collider),至少一个物体有刚体(rigidbody) 有了刚体才会模拟受到力的作用 Mass - 质量 默认为千克 Drag - 阻力 0表示没有阻力 Angular Drag - 扭矩阻力 阻碍旋转的阻力 0表示没有阻力 Is Kinematic - 如果启动此选项,则对象将不会被…

未通过针对firfox的验证,现已被禁用

相信大家很多都碰到过这种问题,我也是网上找了很多方法,都不是很好用,最后破罐子破摔结果就解决了怎么解决呢,直接更新好吧,直接更新最新版本更新完了之后你就会发现解决了,一切都解决了 当然这里只是给大家提供一种思路,虽然网上很多都是复制粘贴,但是特定情况下肯定也…

PCB不同层级的功能和作用

PCB不同层级的功能和作用 示意图:以AltiumDesign为例,各层用途Gerber文件和Altium Design PCB 层级对应关系嘉立创生成geber文件对应功能 生成后的Gerber文件是一个压缩包,解压后文件如下:文件名 类型 备注/说明Gerber_BoardOutline.GKO 边框文件 PCB板厂根据该文件进行切割…

nginx 简单实践:负载均衡【nginx 实践系列之四】

本文为 nginx 简单实践系列文章之三,主要简单实践了负载均衡,仅供参考。〇、前言 本文为 nginx 简单实践系列文章之三,主要简单实践了负载均衡,仅供参考。 关于 Nginx 基础,以及安装和配置详解,可以参考博主过往文章: https://www.cnblogs.com/hnzhengfy/p/Nginx.html …

EFcore 实现带UI的自定义日志记录提供程序

基于 EFcore 实现了一个 .net core 日志记录程序,支持使用 .net 原生的日志框架 Microsoft.Extensions.Logging 将应用程序日志写入关系型数据库,目前支持三种关系型数据库(MS SQL Server、MySQL、PostgreSQL)。日志查看面板 UI 使用 vue3 开发,以嵌入的方式集成到程序集中…

ASE50N30-ASEMI智能家居专用ASE50N30

ASE50N30-ASEMI智能家居专用ASE50N30编辑:ll ASE50N30-ASEMI智能家居专用ASE50N30 型号:ASE50N30 品牌:ASEMI 封装:TO-247 批号:最新 最大漏源电流:50A 漏源击穿电压:300V RDS(ON)Max:68mΩ 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MO…

wr30u 救砖

变砖了 给 wr30u 刷成了 at3000 的uboot,进而导致我的wr30u路由器成了转,进不去uboot了! 准备硬件 usb转串口设备 购买 usb转串口(ttl)设备,在淘宝随便买就行 没啥差别,几块钱一个:目前流行ch340系列的,推荐 ch340g 即可, 功能更强大也贵杜邦线 一般 你在购买 usb转串口…