Solution -「ARC 110F」Esoswap
Link.
给定 的排列 ,每次操作给出 ,交换 和 。构造一种使排列升序的操作序列。
。
反正兔子就一个样例观察法,一个暴力伪解拍上去就 AC 了。(
先讲讲我的伪解,观察样例解释:
First, announce . We swap and , turning into .
Then, announce . We swap and , turning into .
Then, announce . We swap and , turning into .
Finally, announce . We swap and , turning into .
发现三次 ,一次 。考虑到样例的迷惑性,我们尝试让对 的操作挨在一起。交换第一步和第二步,发现操作序列仍合法。
接下来,我们强行解释该操作序列的内在逻辑:
- 希望 ,反复操作 直到 ;
- 希望 ,反复操作 (样例中不需要操作),直到不满足 回到第一步,或满足 ;
- 希望 ,操作同上。
- ……
综上,交换策略为
选择不满足 的最大的 进行交换直到序列升序。
然后就 AC 了,复杂度不知道。(
正解是先操作使得 然后逆序。操作方法考察从后往前的每个 ,不断操作 直至 ,可证至多操作 次,总复杂度 。
伪解:
/* Clearink */
#include <cstdio>
#include <vector>
#define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i )
const int MAXN = 100;
int n, p[MAXN + 5];
std::vector<int> ans;
inline void iswp ( int& a, int& b ) { a ^= b ^= a ^= b; }
int main () {
scanf ( "%d", &n );
rep ( i, 0, n - 1 ) scanf ( "%d", &p[i] );
while ( true ) {
int irr = -1;
rep ( i, 0, n - 1 ) if ( i ^ p[i] && ( !~irr || p[i] > p[irr] ) ) irr = i;
if ( !~irr ) break;
ans.push_back ( irr );
iswp ( p[irr], p[( irr + p[irr] ) % n] );
}
printf ( "%d\n", ( int ) ans.size () );
for ( int i: ans ) printf ( "%d\n", i );
return 0;
}
正解:
/* Clearink */
#include <cstdio>
#include <vector>
#define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i )
const int MAXN = 100;
int n, p[MAXN + 5];
std::vector<int> ans;
inline void iswp ( int& a, int& b ) { a ^= b ^= a ^= b; }
inline void oper ( const int i ) {
ans.push_back ( i ), iswp ( p[i], p[( i + p[i] ) % n] );
}
int main () {
scanf ( "%d", &n );
rep ( i, 0, n - 1 ) scanf ( "%d", &p[i] );
per ( i, n - 1, 1 ) for ( ; p[i] != n - i - 1; oper ( i ) );
per ( i, n - 2, 0 ) {
rep ( j, i + 1, n - 2 ) oper ( j );
oper ( i ), oper ( i );
}
printf ( "%d\n", ( int ) ans.size () );
for ( int i: ans ) printf ( "%d\n", i );
return 0;
}
分类:
A.算法/知识点 / 构造
, C.特殊题目 / 思维
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现