码农知识堂 - 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. }

  • 相关阅读:
    Tool.Net-3.8.8
    Java后端大写字段传到前端,或者使用postman调用后,返回变为小写
    英语语法 — 词性
    微服务实践Aspire项目发布到远程k8s集群
    C# 第三章:类、接口与结构 学习笔记
    Java常用工具类 : StringUtils、CollectionUtils、ArrayUtils、Lists、Maps等
    Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验
    java word 转html 的两种方法
    校园智慧党建小程序源码系统 带完整的搭建教程
    matplotlib做时钟
  • 原文地址:https://blog.csdn.net/EQUINOX1/article/details/139307937
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号