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

转载于:https://www.cnblogs.com/butterflydew/p/9265439.html

洛谷 P1878 舞蹈课 解题报告相关推荐

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

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

  2. 洛谷1056 排座椅 解题报告

    洛谷1056 排座椅 本题地址: http://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头 ...

  3. 洛谷1067 多项式输出 解题报告

    洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...

  4. 洛谷 P4475 巧克力王国 解题报告

    P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...

  5. 洛谷 P4706 取石子 解题报告

    P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些 ...

  6. 洛谷 P1309 瑞士轮 解题报告

    P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...

  7. 洛谷 P2184 贪婪大陆 解题报告

    P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...

  8. 洛谷 P1136 迎接仪式 解题报告

    P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出&q ...

  9. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  10. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

最新文章

  1. golang 遍历list_golang如何把一个list遍历给一个切片
  2. 网传京东某程序员因压力太大,在商品页面置入骂人代码!京东辟谣:不关我们的事,外部商家干的!...
  3. java读取excel并替换占位符_正则表达式 – 有没有一种简单的方法来替换Excel中的占位符?...
  4. 对F-score的理解
  5. ML之Hash_EditDistance:基于输入图片哈希化(均值哈希+差值哈希)即8*8个元素的单向vector利用编辑距离算法进行判别
  6. 关闭页面那点事儿...
  7. netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布
  8. HawtIO在JBoss EAP上(第二部分)
  9. 数据结构之图的遍历:广度优先遍历(BFS)
  10. C语言实现辗转相除法计算两数最大公约数
  11. WebService只能在本地使用,无法通过网络访问的解决办法
  12. STC51-l2C总线
  13. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
  14. matlab 中图字体设置,关于matlab绘图中字体及图片大小等的设置
  15. 英语时态:一般、否定疑问句、现表将来(中文练到无停顿)
  16. 靶机渗透----bulldog2
  17. 十进制浮点数的表示方法
  18. Messaging——Solace PubSub+
  19. 本机远程Windows服务器远程桌面不能相互复制粘贴的两种解决方案
  20. Javascript 设计模式之外观模式【讲师辅导】-曾亮-专题视频课程

热门文章

  1. 分类性能度量指标 : ROC曲线、AUC值、正确率、召回率、敏感度、特异度
  2. luogu3191 [HNOI2007]紧急疏散EVACUATE
  3. 联想微型计算机开机黑屏什么原因,联想笔记本电源键亮但黑屏怎么办
  4. 【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统
  5. 做游戏开发要学什么?
  6. node_modules中的.cache文件夹的占用空间越来越大
  7. 期刊论文发表会有证书吗
  8. 品牌故事对于品牌发展的重要性
  9. 关于判断单峰数组的几种方法
  10. NPOI操作Excel类代码(打开 插入 设置行列宽 合并单元格 增删改工作表 保存等等) .NET4.5