洛谷 P1878 舞蹈课 解题报告
P1878 舞蹈课
题目描述
有\(n\)个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为\(ABCD\),那么\(BC\)出列之后队伍变为\(AD\))。舞蹈技术相差最小即是\(a_i\)的绝对值最小。
任务是模拟以上过程,确定跳舞的配对及顺序。
输入输出格式
输入格式:
第一行为正整数\(n(1<=n<=2*10^5)\):队伍中的人数。下一行包含\(n\)个字符\(B\)或者\(G\),\(B\)代表男,\(G\)代表女。下一行为\(n\)个整数\(a_i(a_i<=10^7)\)。所有信息按照从左到右的顺序给出。在50%的数据中,n<=200。
输出格式:
第一行:出列的总对数\(k\)。接下来输出\(k\)行,每行是两个整数。按跳舞顺序输出,两个整数代表这一对舞伴的编号(按输入顺序从左往右1至n编号)。请先输出较小的整数,再输出较大的整数。
思路:用二叉堆维护差值,用数组模拟链表,取出时判断是否已经用过即可。
Code:
#include <cstdio>
#include <queue>
using namespace std;
int abs(int x){return x>0?x:-x;}
const int N=200010;
struct node
{
int l,r,w;
node(){}
node(int l,int r,int w)
{
this->l=l;
this->r=r;
this->w=w;
}
bool friend operator <(node n1,node n2)
{
if(n1.w==n2.w)
return n1.l>n2.l;
return n1.w>n2.w;
}
};
priority_queue <node > q;
int score[N],color[N],vis[N],n,pre[N],suc[N],ans[N][2];
void init()
{
char c;
scanf("%d",&n);
scanf("\n");
for(int i=1;i<=n;i++)
{
scanf("%c",&c);
if(c=='B') color[i]=1;
pre[i]=i-1;suc[i]=i+1;
}
suc[n]=0;
for(int i=1;i<=n;i++)
scanf("%d",score+i);
for(int i=1;i<n;i++)
if(color[i]^color[i+1])
{
node t(i,i+1,abs(score[i]-score[i+1]));
q.push(t);
}
}
void work()
{
int cnt=0;
while(!q.empty())
{
int l=q.top().l,r=q.top().r;
q.pop();
if(vis[l]||vis[r]) continue;
ans[++cnt][0]=l,ans[cnt][1]=r;
vis[l]=vis[r]=1;
if(!pre[l]||!suc[r]) continue;
if(color[pre[l]]^color[suc[r]])
{
node t(pre[l],suc[r],abs(score[pre[l]]-score[suc[r]]));
q.push(t);
}
suc[pre[l]]=suc[r];
pre[suc[r]]=pre[l];
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
printf("%d %d\n",ans[i][0],ans[i][1]);
}
int main()
{
init();
work();
return 0;
}
2018.7.4
洛谷 P1878 舞蹈课 解题报告的更多相关文章
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P1850 换教室 解题报告
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P2375 [NOI2014]动物园 解题报告
P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
随机推荐
- Netty源码分析第1章(Netty启动流程)---->第2节: NioServerSocketChannel的创建
Netty源码分析第一章: Server启动流程 第二节:NioServerSocketChannel的创建 我们如果熟悉Nio, 则对channel的概念则不会陌生, channel在相当于一个通 ...
- NO.8:自学python之路------并行socket网络编程
摘要 一到放假就杂事很多,这次的作业比较复杂,做了一个周,进度又拖了.不过结果还不错. 正文 粘包 在上一节中,如果连续发送过多数据,就可能发生粘包.粘包就是两次发送的数据粘在一起被接收,损坏了数据的 ...
- 6.capacity scheduler
1.先决条件 要使用yarn的capcitiy调度器,必须开启yarn的ACLs,否则队列ACLs设置不生效 开启yarn ACLs: # hadoop: core-site.xml hadoop ...
- HTTP-HTTPS区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...
- decode 函数及其用法
http://blog.csdn.net/oscar999/article/details/18399177
- CSS命名规范(规则)常用的CSS命名规则
CSS命名规范(规则)常用的CSS命名规则 CSS命名规范(规则)常用的CSS命名规则 头:header 内容:content/container 尾:footer ...
- Scrum Meeting 10.25
成员 已完成任务 下一阶段任务 用时 徐越 阅读前端代码中和通信相关的部分 学习服务器配置 4h 赵庶宏 阅读前端代码中和通信相关的部分 学习服务器配置 4h 薄霖 继续做UI开发 界面优化 4h 武 ...
- OO的第一次死亡
久仰OO大名,总是想着提前做点准备,其实到头来还是什么准备都没有做,所以这学期就是从零开始的面向对象生活,也因此遇到了很多的问题. 第一次作业——多项式加减 第一次作业历来是较为简单的,但是对于面向对 ...
- Linux基础入门--01~03
- week3b:个人博客作业
vs2013的初步使用 由于自己在写这篇博客的时候已经把vs2013安装完毕,就我写了. 这是2013的使用步骤 第一步 注释 箭头指的方向是“点击” 第二步 第三步 第四步 第5步 第六步 最后点击 ...