洛谷 P1878 舞蹈课(优先队列 + 双链表)
舞蹈课
题目描述
有 nnn 个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为 ABCD
,那么 BC
出列之后队伍变为 AD
)。舞蹈技术相差最小即是 aia_iai 的绝对值最小。
任务是模拟以上过程,确定跳舞的配对及顺序。
输入格式
第一行一个正整数 nnn 表示队伍中的人数。
第二行包含 nnn 个字符 B
或者 G
,B
代表男,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 舞蹈课(优先队列 + 双链表)相关推荐
- 洛谷 P1878 舞蹈课 —— 小顶堆
This way 题意: 有 n个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果 ...
- 堆——以洛谷p3378,p1334,p1628,p1878为例
堆 堆的五个基本操作: 1.在集合中插入一个数 heap[++size]=x ; up[size] 2.求集合当中的最小值 heap[1] 3.删除最小值 ...
- 洛谷 深基 第4部分 基础数学与数论(19-21课)
洛谷 深基 第4部分 基础数学与数论 第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...
- 洛谷P1160 队列安排 链表
洛谷P1160 队列安排 链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #i ...
- UESTC 1593 老司机破阵 优先队列+双端链表
老司机破阵 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess
洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...
- 洛谷 Golden Sword(dp,优先队列优化【含板子】)|| 补充练习:洛谷 跳房子
题目链接: 「SWTR-03」Golden Sword - 洛谷 思路: 设表示放第i个原料,锅里共有 j 个时的耐久度之和. 容易知道dp方程为,其中 这样就可以写出暴力dp的代码如下:(需要枚举i ...
- 二分图——洛谷P1155 双栈排序
https://daniu.luogu.org/problem/show?pid=1155 二分图染色+模拟 1.首先考虑一个简单情况--单栈排序,显然有这样的一个事实: a[i]和a[j] 不能压入 ...
- bzoj5248(洛谷4363)(2018九省联考)一双木棋
题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...
- 升序堆和降序堆(优先队列) 洛谷1801
1 // 洛谷1801 2 // 一个升序堆,一个降序堆 3 // 降序堆维护序列的前i个最小值 4 // 插如元素的时候,如果x小于降序堆最大值,则替换,并将最大值插入升序堆:否则,直接插入升序堆 ...
最新文章
- 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别
- 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
- Android开发实践:利用ProGuard进行代码混淆
- MySQL + springboot修改时区的方法小结
- 内存映射获取行数_使用内存映射文件获取巨大的矩阵
- python中可用于布尔测试的,如何在Python中使用布尔值?
- python医学图像分割_基于cv2的医学图像分割
- ASP.NET MVC路由扩展:路由映射
- dpkg和apt-get命令的用法
- JQuery基础学习笔记(1)
- STM32初学(笔记二)紧急按键交通灯
- Centos7通过oh-my-zsh安装powerlevel9k和powerlevel10k
- wifi分析仪怎么看哪个信道好_WiFi信道扫描仪:通过NetSpot选择最佳WiFi信道
- QT5使用PCAN读取CAN数据
- 同工作组计算机连接用户名和密码错误,登录失败: 未知的用户名或错误密码
- 文王八卦圖와 易經組織
- 一个链接,让你的网站访客直接和你qq聊天
- vue项目中获取当前设备 操作系统及版本,设备型号,ip,地区信息
- CSS简介代码实现表格(table)只有横线没有竖线的效果,一个简约卡片化精美的数据表格(类似Bootstrap表格)
- aspectjweaver.jar+ aopalliance.jar+mchange-commons-java.jar+cglib.jar官网下载