码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 构造+模拟,CF1148C. Crazy Diamond


    一、题目

    1、题目描述

    2、输入输出

    2.1输入

    2.2输出

    3、原题链接

    Problem - 1148C - Codeforces


    二、解题报告

    1、思路分析

    题目提示O(5n)的解法了,事实上我们O(3n)就能解决,关键在于1,n的处理

    我们读入数据a[],代表初始数组,p[i]代表 i 的下标

    如果p[i] != i

    说明需要交换

    a[p[i]] 一定能跟a[1]或者a[n]交换, a[i]也一定能跟1或n交换

    假设 a[i]  的可交换位置为x,a[p[i]] 的可交换位置为y(x、y只可能为1、n)

    那么我们使得元素i从p[i] -> y -> x -> i 就在3步之内让i到达了下标i

    此时a[1] 和 a[n]可能不满足a[1] = 1, a[n] = n

    事实上我们将每个元素调整完后再调整1和n即可

    这也是为什么能从O(5n)优化到O(3n)

     

    2、复杂度

    时间复杂度: O(3n)空间复杂度:O(n)

    3、代码详解

    ​
    1. #include
    2. using PII = std::pair<int, int>;
    3. const int N = 3e5 + 10;
    4. int p[N], a[N], n, s;
    5. std::vector path;
    6. void swap(int x, int y) {
    7. std::swap(p[a[x]], p[a[y]]);
    8. std::swap(a[x], a[y]);
    9. path.emplace_back(x, y);
    10. }
    11. int main () {
    12. std::cin >> n;
    13. path.reserve(5 * n);
    14. for (int i = 1; i <= n; i ++ ) std::cin >> a[i], p[a[i]] = i;
    15. for (int i = 1; i <= n / 2; i ++ ) {
    16. if (p[i] != i) {
    17. if (p[i] <= n / 2) {
    18. swap(p[i], n);
    19. swap(i, n);
    20. }
    21. else {
    22. swap(1, p[i]);
    23. swap(1, n);
    24. swap(i, n);
    25. }
    26. }
    27. }
    28. for (int i = n / 2 + 1; i <= n; i ++ ) {
    29. if (p[i] != i) {
    30. if (p[i] > n / 2) {
    31. swap(1, p[i]);
    32. swap(1, i);
    33. }
    34. else {
    35. swap(p[i], n);
    36. swap(1, n);
    37. swap(1, i);
    38. }
    39. }
    40. }
    41. if (a[1] != 1) swap(1, n);
    42. std::cout << path.size() << '\n';
    43. for (auto [x, y] : path)
    44. std::cout << x << " " << y << '\n';
    45. return 0;
    46. }

  • 相关阅读:
    线性代数与编程语言结合 基础
    Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)
    MySQL8.0.24内网部署
    app 更新 对aso是否有影响
    Jmeter系列-线程组的执行顺序(10)
    Go 限流器使用
    MAX25————用vray还原模型在Substance Painter的光照以及材质效果
    出口日本的无线产品是做MIC认证还是TELCE认证?有什么区别?
    AspectJ切面编程(xml方式)
    golang的map
  • 原文地址:https://blog.csdn.net/EQUINOX1/article/details/139307937
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号