舞蹈课

题目描述

有 nnn 个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为 ABCD,那么 BC 出列之后队伍变为 AD)。舞蹈技术相差最小即是 aia_iai​ 的绝对值最小。

任务是模拟以上过程,确定跳舞的配对及顺序。

输入格式

第一行一个正整数 nnn 表示队伍中的人数。

第二行包含 nnn 个字符 B 或者 GB 代表男,G 代表女。

第三行为 nnn 个整数 aia_iai​。所有信息按照从左到右的顺序给出。

输出格式

第一行一个整数表示出列的总对数 kkk。

接下来 kkk 行,每行是两个整数。按跳舞顺序输出,两个整数代表这一对舞伴的编号(按输入顺序从左往右 111 至 nnn 编号)。请先输出较小的整数,再输出较大的整数。

样例 #1

样例输入 #1

4
BGBG
4 2 4 3

样例输出 #1

2
3 4
1 2

提示

对于 50%50\%50% 的数据,1≤n≤2001\leq n\leq 2001≤n≤200。

对于 100%100\%100% 的数据,1≤n≤2×1051\leq n\leq 2\times 10^51≤n≤2×105,1≤ai≤1071\le a_i\le 10^71≤ai​≤107。

题意:

如题。

思路:

题目要求绝对值相差最小的一对异性出列,观察数据范围,显然要用到优先队列控制时间复杂度。

且题目要求对原序列进行删除和拼接,考虑用双链表实现这一点(时间复杂度 O(1)

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>using namespace std;
#define int long long
typedef pair<int, int> pii;
#define x first
#define y second
const int N = 2e5 + 10;
int n;
string qu;
int a[N];
bool st[N];int e[N], l[N], r[N], idx;//初始化
void init()
{l[1] = 0, r[0] = 1;//初始化 第一个点的右边是 1 第二个点的左边是 0idx = 2;//idx 此时已经用掉两个点了
}//在第 K 个点右边插入一个 X
void add(int k, int x)
{e[idx] = x;l[idx] = k;r[idx] = r[k]; //todo 这边的 k 不加 1 , 输入的时候 k+1 就好l[r[k]] = idx;r[k] = idx;idx++;
}//当然在K的左边插入一个数 可以再写一个,也可以直接调用我们这个函数,在k的左边插入一个 数,等价于在l[k]的右边插入一个数add(l[k],x)//*删除第k个点
void remove(int k)
{r[l[k]] = r[k];l[r[k]] = l[k];
}struct node
{int idx1, idx2;int dif;bool operator< (const node& x)const {if (dif == x.dif) return idx1 > x.idx1;return dif > x.dif;}
};signed main()
{int T = 1; //cin >> T;while (T--){init();cin >> n >> qu;qu = " " + qu;for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]), add(i, a[i]);priority_queue<node> heap;for (int i = 1; i <= n - 1; ++i){if (qu[i] != qu[i + 1]){heap.push({ i, i + 1, abs(a[i] - a[i + 1]) });}}int k = 0;vector<pii> ans;while (heap.size()){auto t = heap.top(); heap.pop();if (st[t.idx1] || st[t.idx2]) continue;++k;ans.push_back({ t.idx1, t.idx2 });if (l[t.idx1] && r[t.idx2] != (n + 1) && qu[l[t.idx1]] != qu[r[t.idx2]]){heap.push({ l[t.idx1], r[t.idx2], abs(a[l[t.idx1]] - a[r[t.idx2]]) });}remove(t.idx1), remove(t.idx2);st[t.idx1] = st[t.idx2] = true;         }cout << k << '\n';for (auto v : ans){printf("%lld %lld\n", v.x, v.y);}}return 0;
}

洛谷 P1878 舞蹈课(优先队列 + 双链表)相关推荐

  1. 洛谷 P1878 舞蹈课 —— 小顶堆

    This way 题意: 有 n个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果 ...

  2. 堆——以洛谷p3378,p1334,p1628,p1878为例

    堆 堆的五个基本操作: 1.在集合中插入一个数      heap[++size]=x  ;  up[size] 2.求集合当中的最小值      heap[1] 3.删除最小值           ...

  3. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  4. 洛谷P1160 队列安排 链表

    洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #i ...

  5. UESTC 1593 老司机破阵 优先队列+双端链表

    老司机破阵 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  St ...

  6. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  7. 洛谷 Golden Sword(dp,优先队列优化【含板子】)|| 补充练习:洛谷 跳房子

    题目链接: 「SWTR-03」Golden Sword - 洛谷 思路: 设表示放第i个原料,锅里共有 j 个时的耐久度之和. 容易知道dp方程为,其中 这样就可以写出暴力dp的代码如下:(需要枚举i ...

  8. 二分图——洛谷P1155 双栈排序

    https://daniu.luogu.org/problem/show?pid=1155 二分图染色+模拟 1.首先考虑一个简单情况--单栈排序,显然有这样的一个事实: a[i]和a[j] 不能压入 ...

  9. bzoj5248(洛谷4363)(2018九省联考)一双木棋

    题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...

  10. 升序堆和降序堆(优先队列) 洛谷1801

    1 // 洛谷1801 2 // 一个升序堆,一个降序堆 3 // 降序堆维护序列的前i个最小值 4 // 插如元素的时候,如果x小于降序堆最大值,则替换,并将最大值插入升序堆:否则,直接插入升序堆 ...

最新文章

  1. 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别
  2. 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
  3. Android开发实践:利用ProGuard进行代码混淆
  4. MySQL + springboot修改时区的方法小结
  5. 内存映射获取行数_使用内存映射文件获取巨大的矩阵
  6. python中可用于布尔测试的,如何在Python中使用布尔值?
  7. python医学图像分割_基于cv2的医学图像分割
  8. ASP.NET MVC路由扩展:路由映射
  9. dpkg和apt-get命令的用法
  10. JQuery基础学习笔记(1)
  11. STM32初学(笔记二)紧急按键交通灯
  12. Centos7通过oh-my-zsh安装powerlevel9k和powerlevel10k
  13. wifi分析仪怎么看哪个信道好_WiFi信道扫描仪:通过NetSpot选择最佳WiFi信道
  14. QT5使用PCAN读取CAN数据
  15. 同工作组计算机连接用户名和密码错误,登录失败: 未知的用户名或错误密码
  16. 文王八卦圖와 易經組織
  17. 一个链接,让你的网站访客直接和你qq聊天
  18. vue项目中获取当前设备 操作系统及版本,设备型号,ip,地区信息
  19. CSS简介代码实现表格(table)只有横线没有竖线的效果,一个简约卡片化精美的数据表格(类似Bootstrap表格)
  20. aspectjweaver.jar+ aopalliance.jar+mchange-commons-java.jar+cglib.jar官网下载

热门文章

  1. 计蒜客1185出书最多
  2. 搜狐新闻表情出现怪异现象
  3. webpack 代码压缩优化篇
  4. Github上传代码及解决main主分支问题
  5. 入侵sf服务器技术_入侵服务器、疯狂攻击各种网站, 这个黑客团伙终被“团灭”!...
  6. 【javascript】解析psd文件踩坑
  7. iphone7p配置参数详情_求iPhone7具体参数配置
  8. 蓝蓝设计 使用全屏照片的网页设计欣赏
  9. w ndows7旗舰版镜像下载,win7旗舰版32位原版iso
  10. 汽车CAN总线技术详解