专栏文章
AT_arc110_f 题解
AT_arc110_f题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min44l1e
- 此快照首次捕获于
- 2025/12/01 20:15 3 个月前
- 此快照最后确认于
- 2025/12/01 20:15 3 个月前
好玩的诈骗题。
模拟赛时给了一个启发性的 Subtask 即 。一种做法是对于位置 反复操作 次即可构造。
发现这个题的构造方式很开放,所以需要找到一个固定的操作(组)策略。上述做法启发我们对着一个位置反复操作。
结论:一个位置 反复操作 次后必然有 。证明:显然当交换到 后就一直是 不会动了,那么只需要证明一个位置反复操作不超过 次可以交换到 。设初始 ,那么 会被换到 上去。此后 想要再次换回 就必须有 ,与 矛盾。也就是说, 每次都会换到一个新的数,那么至多 次可以换到 。
这个结论的推论是从后往前依次把 操作 次变为 最后即可排出升序。可以手模一下:
- 最开始是
? ? ? ... ?。 - 连续操作 后变为
? ? ? ... 0。 - 连续操作 后变为
? ? ? ... 0 1。原因是如果 想要为 需要从 换。那么需要用 去换,交换后就有 。 - 连续操作 后变为
? ? ? ... 0 1 2。同理, 需要得到 才能去换 ,那么 需要得到 才能去换 。那么最后 被换到了 , 被换到了 , 被换到了 。 - 同理一路换下去。最后是
0 1 2 ... n。
所以最后输出 个 即可。
CPP#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n,cout<<n*n<<"\n";
for(int i=n-1;i>=0;i--)for(int j=1;j<=n;j++)cout<<i<<"\n";
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...