时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

艾洛喜欢吃甜食,他有n个甜甜圈,现在叠成了两叠(如下图所示),第一叠有n1个,第二叠有n2个(n1+n2=n),要解决的问题如下:

  • 每个甜甜圈都有一个唯一的甜度值sis_isi​,甜度值两两不同;
  • 每次艾洛可以把任意一叠位于顶端的一个甜甜圈移动到另一叠顶端,若该甜甜圈是当前所有甜甜圈中最甜的(甜度值最大),那么艾洛不会移动甜甜圈,而是直接吃掉;

请你求出艾洛吃完所有甜甜圈的最小移动步数;

输入描述:

第一行,两个正整数n1,n2 (1≤n1+n2≤100000),分别表示两叠甜甜圈的个数。
第二行,n1个整数,按从顶到底的顺序排列,表示第一叠甜甜圈的甜度值。
第三行,n2个整数,按从顶到底的顺序排列,表示第二叠甜甜圈的甜度值。
保证1≤si​≤6∗106且两两互不相同。

输出描述:

总共一行,一个整数,表示最少步数。

示例

输入

3 3
1 4 5
2 7 3

输出

6

思路

将俩叠甜甜圈“头对头”接在一起

这样 把某个甜甜圈移动上面的甜甜圈移动到另一堆上面需要几步就转换成了指针从中间开始移动到另一个甜甜圈需要几步。

把队列横过来

5 4 1 ^ 2 7 3   最开始指针在中间 然后依次移动到剩余点数最大的数

5 4 1   2 ^ 3    移动一步 吃掉7

^ 4 1   2    3    移动三步 吃掉5

^ 1   2    3    直接吃掉1

1   2    ^    移动两步 吃掉3

1   ^          直接吃掉2

^               直接吃掉1

共六步

因此我们可以选择pair<int,int>或者结构体来存储数字(甜甜圈甜度)和它的位置

比如:

first           5 4 1  ^  2 7 3

second     1 2 3  3  4 5 6

指针^从se3移动到左边se2是1(3-2)步没问题,但指针移动到右边的se5就变成了2(5-3),实际只需一步,其实只要被选中数及其后面的数的位置全部-1就可以避免这个问题。(因为被选中数要吃掉,后面的数位置自然要前移)

接下来给这些数据排个序(按first值降序,方便起见记得把指针放最前面)

first           ^ 7 5 4 3 2 1

second     3 5 1 2 6 4 3

然后就可以按这个顺序遍历一遍了,每次用当前数字减去去上一个数字的se,但是每查询一个数字就需要对其和后面的位置进行操作。

像这种单点更新,区间查询的操作就需要用到树状数组(不了解的同学可以看看这篇文章)了。

代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
int m, n, len;
int c[MAXN];
pair<int, int>b[MAXN];
int lowbit(int i) {return i & (-i);
}
void update(int x, int y) {for (int i = x; i <= len; i += lowbit(i))c[i] += y;
}
int getsum(int x) {int ans = 0;for (int i = x; i; i -= lowbit(i))ans += c[i];return ans;
}
bool cmp(pair<int, int>A, pair<int, int>B) {return A.first > B.first;
}
int main() {int x;ll ans = 0;cin >> m >> n;len = m + n;for (int i = n + 1; i <= len; i++){cin >> x;update(i, 1); b[i] = { x,i };}for (int i = n; i > 0; i--){cin >> x;update(i, 1);b[i] = { x,i };}sort(b + 1, b + 1 + len, cmp); //按first降序排列b[0].second = n;  //别忘在最前面加上n表示指针,从两堆的拼接处开始for (int i = 1; i <= len; i++) {update(b[i].second, -1);  //更新节点,相当于原始数据的b[i]和后面的数位置左移一位ans += abs(getsum(b[i].second) - getsum(b[i - 1].second));//记得取绝对值}cout << ans;
}

一开始用两个list模拟两杆甜甜圈,思路明了但会超时

#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <list>
using namespace std;
map<int, int, greater<int>>mp;
list<int>q1;
list<int>q2;
int maxn = -1, cnt = 0, ans = 0;
int main() {int a, b, n;cin >> a >> b;for (int i = 0; i < a; i++){cin >> n;mp[n] = 1;q1.push_back(n);}for (int i = 0; i < b; i++){cin >> n;mp[n] = 2;q2.push_back(n);}map<int, int>::iterator iter = mp.begin();while ((!q1.empty()) || (!q2.empty())){if (iter->second == 1) {while (1){if (q1.front() == iter->first) {q1.pop_front();break;}ans++;q2.push_front(q1.front());mp[q1.front()] = 2;q1.pop_front();}}else {while (1){if (q2.front() == iter->first) {q2.pop_front();break;}ans++;q1.push_front(q2.front());mp[q2.front()] = 1;q2.pop_front();}}iter++;}cout << ans;
}

河南省CCPC-J.甜甜圈(详解)相关推荐

  1. Python [:,j] , [:,i:j] , [:j]的详解

    [:,j] ,取每一行的第 j 列的元素 [:,i:j] , 即取矩阵X的所有行中的的第i到i-1列数据,含左不含右. [:j] , 取,一维数组的0到j的数据,含左不含右 import numpy ...

  2. 神经网络的函数表达式,神经网络公式详解pdf

    1.神经网络的准确率是怎么计算的? 其实神经网络的准确率的标准是自己定义的. 我把你的例子赋予某种意义讲解: 1,期望输出[1 0 0 1],每个元素代表一个属性是否存在.像着4个元素分别表示:是否肺 ...

  3. KMP算法图文详解(为什么是next[0]=-1、next[j]=k和k=next[k])

    文章目录 一:KMP算法解决的问题 二:详解KMP (1)暴力匹配的缺点 (2)最长相同前缀和后缀 (3)究竟怎么回溯 (3)next数组 (4)求解next数组 A:next[0]=-1 B:nex ...

  4. 1.1.3 J.U.C并发编程包详解

    目录 1.3.1 Lock接口及其实现 1.3.2 AQS抽象队列同步器详解 1.3.3 并发容器类-1 1.3.4 并发容器类-2 1.3.5 Fork/Join框架详解 1.3.1 Lock接口及 ...

  5. 教你看懂车牌号——全国车牌详解细表

    教你看懂车牌号--全国车牌详解细表 北京市(京)  A  B(出租车)  C  E  F  H  G(远郊区县)  天津市(津)  A  B  C  E(出租车)  河北省(冀)  A 石家庄市 B ...

  6. 基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)

    摘要:本文重点介绍了基于YOLOv5目标检测系统的MATLAB实现,用于智能检测物体种类并记录和保存结果,对各种物体检测结果可视化,提高目标识别的便捷性和准确性.本文详细阐述了目标检测系统的原理,并给 ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  9. 20160203.CCPP体系详解(0013天)

    程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h>//01 ...

  10. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

最新文章

  1. React Diff 算法
  2. (转)我的座驾见谁灭谁!
  3. 再谈 Application ProvidedAar
  4. 字符串转16进制字节数组,字节数组转16进制字符串
  5. 无限超越超级机器人nds_阿里重新定义个人电脑!仅名片大小,无限升级,不怕丢失无惧病毒,价格仅传统PC一半...
  6. 【转载保存】搜索引擎调研文档
  7. 解决ubuntu下pdf中文不显示或乱码问题
  8. java frameview_Java FrameLayout.removeView方法代码示例
  9. laravel 的用户认证
  10. Idea 我的快捷键总结
  11. 收到客户反馈的BUG,主管应该怎么办
  12. sql查询各科成绩前三名
  13. HTML-滚动字幕的源代码(可作滚动公告)
  14. ISA防火墙策略配置以及服务器的发布
  15. 计算每年的母亲节日期-C语言代码
  16. 接入高德地图第三方SDK——如何获取API Key
  17. 未来智安XDR及核心组件产品上榜《嘶吼2022网络安全产业图谱》
  18. Kubectl(完整)基本操作命令
  19. OSG 中 常用的 Uniforms
  20. linux脚本if eq 0,Shell常用的逻辑判断 -lt -eq 等使用及举例说明

热门文章

  1. 计算机二级python模拟软件
  2. 12306减压只需人员分流
  3. 阿里云上传视频回调处理
  4. 2022蓝桥杯javaC省赛
  5. python如何获取文件_python 中文件的读取
  6. Markowitz投资组合优化——寻找有效前沿策略分享
  7. 创建maven项目生成WebRoot目录,web.xml文件,以及修改编译路径classess的解决办法,以及解决找不到或无法加载主类的问题。
  8. NOIp2018集训test-9-23
  9. 阿里云EMAS 移动测试,帮您快速掌握移动端兼容性测试技巧
  10. IT高薪者所具备的人格魅力