Luogu P1878

事实上这道题并不难,但我真没弄懂我手写堆为什么过不了。所以

STL大法好!!!

基本思路

对于每一对相邻异性,将他们的舞蹈技术的差插入一个堆
通过维护这个小根堆,每次就可以取得舞蹈技术差最小的一对
值得注意的是,每次取完一对舞伴之后,要对这对舞伴进行标记,并将堆中所有有这两位舞者参与的舞伴弹出这个堆。并且还需要找到这一对舞伴两边的第一个未被挑出的人,如果是异性则可以作为新的舞伴加入堆

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<queue>
  5. using namespace std;
  6. struct data
  7. {
  8. int l,r,val;
  9. bool operator <(const data&x) const
  10. {
  11. if (x.val!=val) return x.val<val;
  12. else return x.l<l;
  13. }//重载运算符
  14. };
  15. int len,n,que[200005],a[200005],ans,group1[200005],group2[200005],rlen;
  16. bool choice[200005];
  17. priority_queue <data> heap;
  18. int main()
  19. {
  20. scanf("%d\n",&n);
  21. for (int i=1;i<=n;i++)
  22. {
  23. char c;
  24. scanf("%c",&c);
  25. if (c=='B') que[i]=true;//对男生进行标记
  26. }
  27. scanf("%d",&a[1]);
  28. for (int i=2;i<=n;i++)
  29. {
  30. scanf("%d",&a[i]);
  31. if (que[i]!=que[i-1]) //可以组成舞伴则进堆
  32. {
  33. data rec;
  34. rec.l=i-1;rec.r=i;
  35. rec.val=abs(a[i]-a[i-1]);
  36. heap.push(rec);
  37. }
  38. }
  39. while (!heap.empty())
  40. {
  41. data rec=heap.top();
  42. ans++;
  43. group1[ans]=rec.l;
  44. group2[ans]=rec.r;
  45. choice[rec.l]=choice[rec.r]=true;//打上标记
  46. while (choice[rec.l]||choice[rec.r])
  47. {
  48. if (heap.empty()) break;
  49. heap.pop();
  50. rec=heap.top();
  51. }//这一个循环的目的就是使堆顶元素是没有被选过的
  52. int l=group1[ans];int r=group2[ans];
  53. while (l>0&&choice[l]) l--;
  54. while (r<=n&&choice[r]) r++;
  55. //寻找两边未被选的人
  56. if (que[l]!=que[r]&&l>0&&r<=n)
  57. {
  58. rec.l=l;
  59. rec.r=r;
  60. rec.val=abs(a[l]-a[r]);
  61. heap.push(rec);
  62. }
  63. }
  64. printf("%d\n",ans);
  65. for (int i=1;i<=ans;i++) printf("%d %d\n",group1[i],group2[i]);
  66. return 0;
  67. }

【Luogu P1878】舞蹈课的更多相关文章

  1. 洛谷 P1878 舞蹈课 解题报告

    P1878 舞蹈课 题目描述 有\(n\)个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始 ...

  2. 舞蹈课(dancingLessons)

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

  3. 【笔记】CF1251E Voting 及相关

    题目传送门 贪心: 一个人 \(i\) 要投票,两种情况:花钱,或当前的人数达到了 \(m_i\). 而当前达到 \(m_i\) 的话所有 \(m_j \le m_i\) 也就达到要求了. 所以考虑将 ...

  4. 二模01day1解题报告

    T1.音量调节(changingsounds) 有n个物品的背包(有点不一样,每个物品必须取),给出初始价值,物品价值可正可负(就是两种选择嘛),求可能的最大价值,不可能(<0或>maxs ...

  5. Bruce Eckel:编程生涯(转载)

    Bruce Eckel:编程生涯(转载) 说明:Bruce Eckel 著有大名鼎鼎的<Thinking in C++>和<Thinking in Java>.本文是他对程序员 ...

  6. 01day1

    最大音量 动态规划 题意:给出一个初始值和一个变化序列 c,在第 i 步可以加上或减去 c[i],求 n 步之后能达到的最大值.有一个限定值 maxlevel,在变化过程中值不能超过 maxlevel ...

  7. 9.29noip模拟试题

    环上的游戏(cycle) 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这 ...

  8. TED Talk-教育如何扼杀创造力

    TED上面有个"11个必须看的TED演讲"的播放列表,"教育扼杀创新"是其中一个.下面贴的是演讲的中文翻译. 早上好. 前面的演讲都很好,对不对? 我已经完全被 ...

  9. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

随机推荐

  1. GC 知识点补充——CMS

    之前已经讲过了不少有关 GC 的内容,今天准备将之前没有细讲的部分进行补充,首先要提到的就是垃圾收集器. 基础的回收方式有三种:清除.压缩.复制,衍生出来的垃圾收集器有: Serial 收集器 新生代 ...

  2. 开发架构+osi七层协议+socket(day26)

    目录 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议/OSI七层协议 传输层 网络层 数据链路层 物理连接层 socket 什么是socket 为什么用socket 如何使用 软件开发架构 ...

  3. web前端面试题(含答案)

    HTML+CSS1.对WEB标准以及W3C的理解与认识标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所 ...

  4. Spring(二)装配Spring Bean

    控制反转的概念:控制反转是一种通过描述(在Java中或者是XML或者注解)并通过第三方去产生或获取特定对象的方式. 在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependenc ...

  5. MarkDown时序图

    时序图 语法 ```sequence ``` 标题 title: 我是标题 对象 participant A participant B as b-alias 交互 sequence A->B: ...

  6. Object 的方法总结

    1.Object.create() Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__. 用法:Object.create( proto, [pro ...

  7. Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required [ IDEA mybatis项目报错 ]

    今天笔者用Springboot框架整合Mybatis做一个小小的项目: 代码写完,在运行项目时,IDEA给我报了3处错误: org.springframework.beans.factory.Unsa ...

  8. Java 计算n对应的二进制位上有几个1,分别在什么位置

    Java计算n的二进制位上有几个1,分别在什么位置   public List<Integer> getBinOneCount(int n){     List<Integer> ...

  9. CSPS模拟 63

    每天都考试都快傻了O_o $T1 Median$ 一看就不能从通项上下手.. 那么就是..给你一个序列..区间中位数.. 对顶堆! 爆调2h,心态炸裂. 据说根据鬼畜的函数定义和$mod<=le ...

  10. zookeeper集群搭建2.7

    http://blog.csdn.net/uq_jin/article/details/51513307