题目大意

对升序排列的n个数字(1开始编号)进行一系列操作,输出最终序列的奇位数之和。操作如下:

  • 1 X Y:把X移到Y左侧
  • 2 X Y:把X移到Y右侧
  • 3 X Y:交换X和Y
  • 4:反转序列(逆置)

思路分析

若是直接用链表模拟,在查找和反转时会消耗大量时间,导致超时,因此,如何解决这两个问题是关键。

  • 查找:为了简化,可用STL的list模拟链表,同时定义pos存储每个数对应的链表指针,在查询时时间复杂度为O(1)
vector<list<int>::iterator> pos(n+1);
  • 反转:不一定真正去反转链表,可定义开关标记inv=0,其中inv=1表示反转一次,再次反转则inv=0,由于增加了标记,那么每个操作均需考虑标记的值,当inv=1时,考虑如下情况:

    • 当op=1或2时,则需做相反操作,即op=3-op
    • 当op=3时,交换不受影响
    • 当op=4时,inv=0
    • 当输出时,若链表个数为偶数,则输出下标为偶数的元素和;否则均输出奇数下标的元素之和

注意点

  • 最后计算总和时需用long long保存,否则会溢出

代码

#include<bits/stdc++.h>
using namespace std;
int n, m, op, a, b, num=0;
int main() {while (scanf("%d %d", &n, &m) == 2) {list<int> l(n); // 存储1-nvector<list<int>::iterator> pos(n+1); // pos[i]表示数字i在list中的指针int idx=1, inv=0;for (auto p=l.begin(); p != l.end(); p++, idx++) { // 初始化*p = idx;pos[idx] = p;}for (int i = 0; i < m; i ++) { // m个操作scanf("%d", &op);if (op != 4) scanf("%d %d", &a, &b);if (op == 4) inv = !inv; // 反转标记else if (op == 3) swap(*pos[a],*pos[b]), swap(pos[a], pos[b]); // 交换else {l.erase(pos[a]); // 先擦除if (inv == 1) op = 3 - op; // 反转则左右交换auto p=pos[b];if (op == 2) p ++; // 插入右侧pos[a] = l.insert(p, a); // a的新位置}}long long cnt=1, oddsum=0; // 避免溢出for (auto p=l.begin(); p != l.end(); p++, cnt++) {if (cnt % 2 == 1) oddsum += *p;}printf("Case %d: %lld\n", ++num, (inv == 1 && n%2 == 0) ?  (long long)n*(n+1)/2-oddsum : (long long)oddsum);}return 0;
}

收获:

如果数据结构上的某一个操作很耗时,有时可以用加标记的方式处理,而不需要真的执行那个操作。但同时,该数据结构的所有其他操作都要考虑这个标记。


择苦而安,择做而乐,虚拟现实终究比不过真实精彩之万一。

33行代码AC——例题6-5 移动盒子(Boxes in a Line, UVa 12657)——解题报告相关推荐

  1. 例题6-5 移动盒子(Boxes in a Line, UVa 12657)

    例题6-5 移动盒子(Boxes in a Line, UVa 12657) 双向链表(数组模拟) #include<iostream> #include<algorithm> ...

  2. 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...

  3. 21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告

    励志用少的代码做高效的表达. 题目(提交)链接→UVa-1594 本题为水题,因此侧重点从解题转变为优化. 注意点: 1.下一轮是按照上一轮的每个数做运算,但下一轮每次运算都会改变数列的值,造成运算不 ...

  4. 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告

    励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-679 题目大意: 有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,如果开关打开,则落向该节点的右子树,如果开关关闭,则 ...

  5. 30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-442 储备知识: 矩阵相乘次数: 如图:A矩阵*B矩阵得到C矩阵. C矩阵中元素个数=A矩阵行数*B矩阵列数.得到C矩阵中任意元素都需要运 ...

  6. 19行代码AC——例题 6-2 铁轨(Rails, UVa 514)——解题报告

    励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-514 此题的本质是:给出"入栈顺序",判断给定序列是否可以出栈. 有点像这种题: 因此思路也类似: 思路: 数组存储列 ...

  7. 22行代码AC——例题7-1除法(Division UVa 725)——解题报告

    励志用尽量少的代码做高效的表达 题目(提交)链接→UVa-725 题目大意: 0-9不重复的组成两个5位数,如果数A/数B=n,则为可行解. 思路分析: 本题实质是通过巧妙分析的暴力求解法. 下等解法 ...

  8. 43行代码AC——例题6-8 树(Tree,UVa 548)——解题报告

    励志用尽量少的代码做高效的表达. You are to determine the value of the leaf node in a given binary tree that is the ...

  9. 比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告

    题意: 丑数是一些因子只有2,3,5的数.数列1,2,3,4,5,6,8,9,10,12,15--写出了从小到大的前11个丑数,1属于丑数.现在请你编写程序,找出第1500个丑数是什么. 没有输入 输 ...

最新文章

  1. Zabbix监控实现跨区域跨网络监控数据
  2. 网易云网络服务研发实践—第1代云网络服务|网易云
  3. GT-----FAQ整理
  4. python怎么重命名word文件,Python读取word文本操作详解
  5. monolith_将Java EE Monolith雕刻成微服务
  6. 3.15 晚会—「饿了么」之殇
  7. php判断当前页面是否有权限,php判断是否有权限下载
  8. 在线Javascript加密混淆工具
  9. mysql regexp instr_MySQL 正则表达式:regexp_instr 函数
  10. 2020年生肖码表图_2020年生肖排位表 鼠年号码岁数表
  11. 影视观影神器:ZY Player for Mac使用教程
  12. AppSo发布到AppWall页面流程及页面原型还原
  13. DS 500PM mobil便携式智能图表记录仪订购代码0500 5340_A1_B1_C1_D1_E1
  14. 光纤跳线、尾纤、光纤连接器之间有什么区别
  15. 【深度学习】实例分割网络
  16. 系统定时重启服务脚本案例
  17. 手把手教你,抖音去水印-有手就能学会
  18. Jenkins启动报错:Jenkins requires Java versions [8, 11] but you are running with Java 13 from xx/xx/xx
  19. 渣渣做后端真题-- 快手2020校园招聘秋招笔试--工程A试卷 选择题
  20. 电脑收不到UDP广播

热门文章

  1. 浅谈tcp的三次握手和四次挥手的理解
  2. 输入某年某月某日,判断这一天是这一年的第几天?(使用python语言)
  3. 手写实现Spring(IOC、DI),SpringMVC基础功能
  4. TCP协议疑难杂症全景解析|硬核
  5. 一道非常经典C++面试题|大厂面试
  6. RabbitMQ负载均衡(4)——LVS
  7. 如何用shell脚本编译java工程
  8. 太卷了~ 八股文,算法张口就来?2022版Java面试手册帮你全拿捏
  9. 2022校招百度提前批校园招聘
  10. 音视频技术开发周刊 | 148