Codeforces Global Round 23-C
C-Permutation Operations
题目链接:https://codeforces.com/contest/1746/problem/C
此题着实不难,就是看你自己能不能想到那种构造的方法。自己做的时候没有很好的思路,所以参考了官方的解析()。
个人觉得官方解析不错,一步一步来的蛮好。
就着官方题解的思路,说说目前自己的想法。首先我们想要最后得到的排列中逆序数最小,那么可以证明,可以为0,所以肯定要奔着0的目标去,这就意味着对于两两相邻的的元素来说,必定有后一个元素大于前面一个元素,那么当这个条件不满足的时候,我们可以考虑到由于原序列是1到n的一个排列(不重复),这意味着我们可以将第ai次(i<n)操作加到i+1的位置上,这样就保持了ai≤ai+1,那么对a1~an-1都进行这样的操作就可以使得整体保持相邻不递减的状态,又由于不等式是可以传递的,所以说,整体即达到了想要的状态。而最后的an次操作随便加到哪个位置都可以,因为它不会改变最终的状态。
当然可以这样是最简单的思路,但是想到这个思路就是一件难事,所以还是得多练。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<vector> #define ll long long #define ull unsigned long long #define mem(x,y) memset(x,y,sizeof(x)) //#define int long long inline ll read() { ll x=0,f=1; char ch= getchar (); while (ch< '0' ||ch> '9' ){ if (ch== '-' ) f=-1;ch= getchar ();} while (ch>= '0' &&ch<= '9' ){x=x*10+ch-48;ch= getchar ();} return x*f; } using namespace std; const int maxm=1e5+5,inf=0x3f3f3f3f; int n,a[maxm],b[maxm]; void solve(){ cin>>n; for ( int i=1;i<=n;++i) cin>>a[i]; int p=1; for ( int i=1;i<=n;++i){ b[a[i]]=i; } for ( int i=1;i<n;++i){ if (b[i]!=n) cout<<b[i]+1<< ' ' ; else cout<<1<< ' ' ; } if (b[n]!=n) cout<<b[n]+1<<endl; else cout<<1<<endl; return ; } signed main(){ // ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int _=1; cin>>_; while (_--){ solve(); } return 0; } |
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/16810756.html
分类:
oj - Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧