33行代码AC——例题6-5 移动盒子(Boxes in a Line, UVa 12657)——解题报告
题目大意
对升序排列的n个数字(1开始编号)进行一系列操作,输出最终序列的奇位数之和。操作如下:
1 X Y
:把X移到Y左侧2 X Y
:把X移到Y右侧3 X Y
:交换X和Y4
:反转序列(逆置)
思路分析
若是直接用链表模拟,在查找和反转时会消耗大量时间,导致超时,因此,如何解决这两个问题是关键。
- 查找:为了简化,可用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)——解题报告相关推荐
- 例题6-5 移动盒子(Boxes in a Line, UVa 12657)
例题6-5 移动盒子(Boxes in a Line, UVa 12657) 双向链表(数组模拟) #include<iostream> #include<algorithm> ...
- 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告
励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...
- 21行代码AC——例题5-2 Ducci序列(Ducci Sequence,UVa1594)——解题报告
励志用少的代码做高效的表达. 题目(提交)链接→UVa-1594 本题为水题,因此侧重点从解题转变为优化. 注意点: 1.下一轮是按照上一轮的每个数做运算,但下一轮每次运算都会改变数列的值,造成运算不 ...
- 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告
励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-679 题目大意: 有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,如果开关打开,则落向该节点的右子树,如果开关关闭,则 ...
- 30行代码AC——例题6-3 矩阵链乘(Maxtrix Chain Multiplication, UVa 442)——解题报告
励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-442 储备知识: 矩阵相乘次数: 如图:A矩阵*B矩阵得到C矩阵. C矩阵中元素个数=A矩阵行数*B矩阵列数.得到C矩阵中任意元素都需要运 ...
- 19行代码AC——例题 6-2 铁轨(Rails, UVa 514)——解题报告
励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-514 此题的本质是:给出"入栈顺序",判断给定序列是否可以出栈. 有点像这种题: 因此思路也类似: 思路: 数组存储列 ...
- 22行代码AC——例题7-1除法(Division UVa 725)——解题报告
励志用尽量少的代码做高效的表达 题目(提交)链接→UVa-725 题目大意: 0-9不重复的组成两个5位数,如果数A/数B=n,则为可行解. 思路分析: 本题实质是通过巧妙分析的暴力求解法. 下等解法 ...
- 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 ...
- 比紫书优化,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个丑数是什么. 没有输入 输 ...
最新文章
- Zabbix监控实现跨区域跨网络监控数据
- 网易云网络服务研发实践—第1代云网络服务|网易云
- GT-----FAQ整理
- python怎么重命名word文件,Python读取word文本操作详解
- monolith_将Java EE Monolith雕刻成微服务
- 3.15 晚会—「饿了么」之殇
- php判断当前页面是否有权限,php判断是否有权限下载
- 在线Javascript加密混淆工具
- mysql regexp instr_MySQL 正则表达式:regexp_instr 函数
- 2020年生肖码表图_2020年生肖排位表 鼠年号码岁数表
- 影视观影神器:ZY Player for Mac使用教程
- AppSo发布到AppWall页面流程及页面原型还原
- DS 500PM mobil便携式智能图表记录仪订购代码0500 5340_A1_B1_C1_D1_E1
- 光纤跳线、尾纤、光纤连接器之间有什么区别
- 【深度学习】实例分割网络
- 系统定时重启服务脚本案例
- 手把手教你,抖音去水印-有手就能学会
- Jenkins启动报错:Jenkins requires Java versions [8, 11] but you are running with Java 13 from xx/xx/xx
- 渣渣做后端真题-- 快手2020校园招聘秋招笔试--工程A试卷 选择题
- 电脑收不到UDP广播