第十二章 贪心 3 AcWing 1553. 用 Swap(0, i) 操作进行排序

绝地灬酷狼 2024-03-31 13:49 171阅读 0赞

第十二章 贪心 3 AcWing 1553. 用 Swap(0, i) 操作进行排序

原题链接

AcWing 1553. 用 Swap(0, i) 操作进行排序

算法标签

贪心 置换群

思路

构图
如何增加有向边
节点编号为i的节点对应位置为p[i],增加有向边i——>p[i]
节点编号为0的节点对应位置为1,增加有向边0——>1, 节点编号为1的节点对应位置为3,增加有向边1——>3, 节点编号为3的节点对应位置为4,增加有向边3——>4,节点编号为4的节点对应位置为0,增加有向边4——>0。
点编号为2的节点对应位置为2,增加有向边2——>2 构成自环

在这里插入图片描述
最终目标
将n个节点构成自环(节点编号为i的节点对应位置为p[i])

进行swap操作对环的影响
在这里插入图片描述
以节点0为起点,先对节点0所在的环进行操作, 将节点0与环内next点进行swap操作,节点0所在的环操作完毕, 与环外点swap使两环合并为一环, 继续上述操作, 详细思路见代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define rep(i, a, b) for(int i=a;i<b;++i)
  11. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  12. using namespace std;
  13. typedef pair<int, int> PII;
  14. const int N=100005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  15. const double Exp=1e-8;
  16. //int t, n, m, cnt, ans;
  17. int p[N];
  18. inline int rd(){
  19. int s=0,w=1;
  20. char ch=getchar();
  21. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  22. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  23. return s*w;
  24. }
  25. void put(int x) {
  26. if(x<0) putchar('-'),x=-x;
  27. if(x>=10) put(x/10);
  28. putchar(x%10^48);
  29. }
  30. signed main(){
  31. ios::sync_with_stdio(false);
  32. cin.tie(0);
  33. cout.tie(0);
  34. int n=rd();
  35. rep(i, 0, n){
  36. int id=rd();
  37. p[id]=i;
  38. }
  39. int res=0;
  40. for(int i=1; i<n;){
  41. // 节点0所在的环操作完毕 p[0]=0
  42. while(p[0]){
  43. swap(p[0], p[p[0]]);
  44. ++res;
  45. }
  46. // 点0所在的环找到非自环节点i
  47. while(i<n&&p[i]==i){
  48. ++i;
  49. }
  50. if(i<n){
  51. swap(p[0], p[i]);
  52. ++res;
  53. }
  54. }
  55. printf("%lld", res);
  56. return 0;
  57. }

参考文献

AcWing 1553. 用 Swap(0, i) 操作进行排序(PAT甲级辅导课)y总视频讲解

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PD3.0详解 总结

    前面的章节分开介绍了协议层和策略层的俩个重要策略!今天想总结一下,并做一些补充。如果有一些内容没有介绍到,可能后续会补充,同学们可以关注一下大师匈。 补充点一、读Emark