专栏文章

AT_arc110_f 题解

AT_arc110_f题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min44l1e
此快照首次捕获于
2025/12/01 20:15
3 个月前
此快照最后确认于
2025/12/01 20:15
3 个月前
查看原文
好玩的诈骗题。
模拟赛时给了一个启发性的 Subtask 即 p0=n1,pi=i1(i0)p_0=n-1,p_i=i-1(i\neq 0)。一种做法是对于位置 00 反复操作 n1n-1 次即可构造。
发现这个题的构造方式很开放,所以需要找到一个固定的操作(组)策略。上述做法启发我们对着一个位置反复操作。
结论:一个位置 ii 反复操作 n1n-1 次后必然有 pi=0p_i=0
证明:显然当交换到 00 后就一直是 00 不会动了,那么只需要证明一个位置反复操作不超过 n1n-1 次可以交换到 00。设初始 pi=v(v0)p_i=v(v\neq 0),那么 vv 会被换到 pi+vp_{i+v} 上去。此后 pip_i 想要再次换回 vv 就必须有 pi=vp_i=v,与 pi+v=vp_{i+v}=v 矛盾。也就是说,pip_i 每次都会换到一个新的数,那么至多 n1n-1 次可以换到 00
这个结论的推论是从后往前依次把 n10n-1\sim 0 操作 nn 次变为 00 最后即可排出升序。可以手模一下:
  • 最开始是 ? ? ? ... ?
  • 连续操作 n1n-1 后变为 ? ? ? ... 0
  • 连续操作 n2n-2 后变为 ? ? ? ... 0 1。原因是如果 pn2p_{n-2} 想要为 00 需要从 pn1p_{n-1} 换。那么需要用 pn2=1p_{n-2}=1 去换,交换后就有 pn2=0,pn1=1p_{n-2}=0,p_{n-1}=1
  • 连续操作 n3n-3 后变为 ? ? ? ... 0 1 2。同理,pn3p_{n-3} 需要得到 11 才能去换 pn2=0p_{n-2}=0,那么 pn3p_{n-3} 需要得到 22 才能去换 pn1=1p_{n-1}=1。那么最后 22 被换到了 pn1p_{n-1}11 被换到了 pn2p_{n-2}00 被换到了 pn3p_{n-3}
  • 同理一路换下去。最后是 0 1 2 ... n
所以最后输出 nnn10n-1\sim 0 即可。
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 条评论,欢迎与作者交流。

正在加载评论...