【优先队列】【最近连STL都写不出来了/(ㄒoㄒ)/~~】hdu_5360/多校#6_1008

题意:就是让你写出一个邀请朋友的顺序,朋友答应一起出去玩的条件是除他以外所有同意出去玩的人数要在[ l[i], r[i] ]范围内,否则他就不答应。

分析:这题比赛的时候想麻烦了,其实只要在左边界满足的条件下看右边界就可以。

     首先将左边界满足的所有右边界及其id加到一个按右边界值从小到大排序的优先队列里,然后取第一个右边界,如果右边界值小于当前所有同意出去玩的人数,直接将其pop()掉,继续看队列里的第一个元素,否则将此id保存下来,总人数+1,pop()掉第一个元素,继续添加左边界满足条件的右边界及id值。

Tips:  ①优先队列"priority_queue<int> pq;"是一个越小的整数优先级越低的优先队列。

    若想越小的整数优先级越高,则可以这样定义:"priority_queue<int,vector<int>, greater<int> > pq;"

     ②对于将右边界与id值插入到优先队列我们可以利用"pair<first, second>"来实现,"pair<first, second>"中默认的比较运算符为先比较first再比较second;\

    同样要想让优先队列中右边界小的优先级越高,则可以"priority_queue<pii,vector<pii>, greater<pii> > pq;";

        标程里有更巧妙的就是直接取右边界值的相反数,这样就可以直接定义"priority_queue<pii> pq;"了;

     ③比较坑的一点用"priority_queue<pii,vector<pii>, greater<pii> > pq;"定义的时候在hdu上用C++交会返回编译错误,G++就会过;这两个的区别还是搞不懂。欢迎各路大神解惑。

附标程

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <queue>
 5 #include <algorithm>
 6 using namespace std;
 7 typedef pair<int, int> PII;
 8 const int MAXN = 100000 + 10;
 9
10 struct W
11 {
12     int l, r, id;
13     bool operator < (const W &rhs) const
14     {
15         return l < rhs.l || (l == rhs.l && r < rhs.r);
16     }
17 } A[MAXN];
18
19 int ret[MAXN], vs[MAXN], n;
20
21 int main()
22 {
23     int T;
24     scanf("%d", &T);
25     for (int _ = 0; _ < T; ++ _)
26     {
27         scanf("%d", &n);
28         for (int i = 0; i < n; ++ i)
29         {
30             scanf("%d", &A[i].l);
31             A[i].id = i;
32             vs[i] = 0;
33         }
34         for (int i = 0; i < n; ++ i)
35         {
36             scanf("%d", &A[i].r);
37         }
38         sort(A, A + n);
39         priority_queue<PII> Q;
40         int cnt(0), i(0);
41         while (1)
42         {
43             while (i < n && A[i].l <= cnt) Q.push(PII(-A[i].r, A[i].id)), ++ i;
44             while (!Q.empty() && -Q.top().first < cnt) Q.pop();
45             if (Q.empty()) break;
46             ret[cnt ++] = Q.top().second;
47             Q.pop();
48             vs[ret[cnt - 1]] = 1;
49         }
50         printf("%d\n", cnt);
51         for (int i = 0; i < n; ++ i) if (!vs[i]) ret[cnt ++] = i;
52         for (int i = 0; i < n; ++ i)
53         {
54             printf("%d%c", ret[i] + 1, " \n"[i == n - 1]);
55         }
56     }
57     return 0;
58 }

附G++ AC代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8 const int maxn = 100005;
 9 typedef pair<int, int> pii;
10 struct Node
11 {
12     int id, l, r;
13     Node () {}
14     Node (int _id, int _r) : id(_id), r(_r) {}
15     bool operator < (const Node& rhs) const
16     {
17         return l < rhs.l || (l == rhs.l && r < rhs.r);
18     }
19 }a[maxn];
20 int vis[maxn], id[maxn];
21 int main()
22 {
23     int T;
24     scanf("%d", &T);
25     while(T--)
26     {
27         int n; scanf("%d", &n);
28         for(int i = 0; i < n; i++) scanf("%d", &a[i].l), a[i].id = i, vis[i] = 0;
29         for(int i = 0; i < n; i++) scanf("%d", &a[i].r);
30         sort(a, a+n);
31         priority_queue<pii, vector<pii>, greater<pii> > pq;
32         int cur = 0, cnt = 0;
33         while(1)
34         {
35             while(cur < n && a[cur].l <= cnt)
36                 pq.push(pii(a[cur].r, a[cur].id)), cur++;
37
38             while(!pq.empty() && cnt > (pq.top()).first)
39                 pq.pop();
40
41             if(!pq.empty())
42             {
43                 vis[pq.top().second] = 1;
44                 id[cnt++] = pq.top().second;
45                 pq.pop();
46             }
47             else break;
48         }
49         printf("%d\n", cnt);
50         for(int i = 0; i < n; i++)
51             if(!vis[i])
52                 id[cnt++] = i;
53         for(int i = 0; i < cnt; i++)
54         {
55             if(i) printf(" ");
56             printf("%d", id[i]+1);
57         }
58         printf("\n");
59     }
60     return 0;
61 }

时间: 2024-07-29 09:59:37

【优先队列】【最近连STL都写不出来了/(ㄒoㄒ)/~~】hdu_5360/多校#6_1008的相关文章

Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式

Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式 >> ios 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/ios/1010000008980619/MethodSwizzing中一般替换方法都写在Category类别里吗有没有别的实现方式.html

jQuery之父:每天都写点代码

去年秋天,我的"兼职编程项目"遇到了一些问题:要不是从 Khan Academy 的项目里挪出时间来的话,我根本没办法将不理想的进度弥补上. 这些项目遇到了一些严重的问题.之前的工作我主要是在周末,有时是工作日的晚上做.但最终证明,这样的工作安排并不适合我.为了在周末尽可能地尝试完成高质量的工作,我压力巨大(如果我做不到的话,会有很深的挫败感).这样安排的问题在于周末并不一定都有空–而我也不想周末两天都在写代码(要牺牲掉所有的休闲和乐趣). 另外一个问题就是隔了一周这么长的时间之后,很

java解析从接口获取的json内容并写到excle(只写与标题匹配的值,并非把所有的接口返回值都写进去)

需求:从接口中获取的一个json数组中有多个对象,每个对象中的值并非都需要,只需查出标题中的几项对应的值即可.且还需要按某个字段排序后依次写到excel 实现方法如下: package jansonDemo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.poi.xssf.userm

面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的

面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中mybatis的@Transactional注解,大家知道被这个注解注释的函数立即就能获得DB的事务能力. 2)python中的with threading.Lock(),大家知道,被这个with代码块包裹的部分立即获得同步的锁机制. 这样我们把事务和加锁这两种与业务无关的逻辑抽象出来,在逻辑上解耦,并且可

程序员写了一个新手都写不出的低级bug,被骂惨了。

本文转自:https://www.cnblogs.com/aobing/p/12189755.html 这篇文章算是读后总结,刚开始看这篇博客不理解啊,咨询了一下身边厉害的大佬.Oh Oh 原来是这样!!! 希望能给跟我一样的小白,一点点启发. 你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西.

mysql数据库定时自动备份(坑点都写出来了)

(1)首先创建text文件,(在什么地方创建都可以)修改后缀名为bat的文件,如果你的电脑没有设置显示后缀名,先通过左击我的电脑,“查看”->“文件扩展名”->打钩,这样你才那个成功修改后缀名为bat,否则是假的bat文件. (2)编辑刚刚创建的bat文件,(你也可以在创建txt文件的时候先修改好)加入如下内容保存:其中d:/MySQL/bin/mysqldump.exe"路径改成你自己对应的,DBNAME是你要备份的数据库,pxxx,我对于的是proot,其中root是密码,当然你

记得初学JS时候练个九九乘法表都写的要死要活

还记得当初刚接触JS时候,看到视频中老师写了个九九乘法表,觉得好神奇,可是自己在下面动手写了半天还是有各种问题,甚是懊恼啊.今又看到园子里有关于乘法表的博文,出于对过去的不舍与缅怀,遂重写一遍. <script> write('<table>'); for (var i = 1;i<10;i++) {  write('<tr>')  for (var j =1;j<=i;j++) {    write('<td>'+j+'*'+i+'='+j*i

解析数据时,快速查看当前需要创建的数据模型的所有属性,不用每个都写,直接打印粘贴

创建一个NSDictionary类别: #import <Foundation/Foundation.h> /** 根据网络请求返回的字典数据,写对应的模型.当属性多时,用手写很费功夫,可用这个类快速打印出所有的模型属性,直接粘贴即可 */ @interface NSDictionary (PropertyCode) //生成需要的属性代码 - (void)getPropertyCode; @end #import "NSDictionary+PropertyCode.h"

2019.10.7 学习开始 +假期总结+上个周总结都写在这里吧

今天是正式开始上课的日子.Bad 假期因为昨晚上比较慌张瞎写了一阵子,概率论是写完了,但是十分低效.也还没对完答案. 最近的大问题:注意力不集中.低效 假期出去玩的过程中,确实旅游并没有想象中的那般有意思,就是跟喜欢的人一起去看陌生的风景.旅游过程中,一大关键是没做好攻略吧.我觉得下次一定要早睡早起才可以,然后适度的做好攻略,里面肯定由可以舍去的地方,防止时间不够用,肯定还要留出一块空闲的时间.然后最重要的就是早睡早起啦!不能浪费时间.关于跟洒在不同方面的相处....感觉不必总结了.....时间