题意:就是让你写出一个邀请朋友的顺序,朋友答应一起出去玩的条件是除他以外所有同意出去玩的人数要在[ 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++就会过;这两个的区别还是搞不懂。欢迎各路大神解惑。

附标程

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int MAXN = + ; struct W
{
int l, r, id;
bool operator < (const W &rhs) const
{
return l < rhs.l || (l == rhs.l && r < rhs.r);
}
} A[MAXN]; int ret[MAXN], vs[MAXN], n; int main()
{
int T;
scanf("%d", &T);
for (int _ = ; _ < T; ++ _)
{
scanf("%d", &n);
for (int i = ; i < n; ++ i)
{
scanf("%d", &A[i].l);
A[i].id = i;
vs[i] = ;
}
for (int i = ; i < n; ++ i)
{
scanf("%d", &A[i].r);
}
sort(A, A + n);
priority_queue<PII> Q;
int cnt(), i();
while ()
{
while (i < n && A[i].l <= cnt) Q.push(PII(-A[i].r, A[i].id)), ++ i;
while (!Q.empty() && -Q.top().first < cnt) Q.pop();
if (Q.empty()) break;
ret[cnt ++] = Q.top().second;
Q.pop();
vs[ret[cnt - ]] = ;
}
printf("%d\n", cnt);
for (int i = ; i < n; ++ i) if (!vs[i]) ret[cnt ++] = i;
for (int i = ; i < n; ++ i)
{
printf("%d%c", ret[i] + , " \n"[i == n - ]);
}
}
return ;
}

附G++ AC代码

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = ;
typedef pair<int, int> pii;
struct Node
{
int id, l, r;
Node () {}
Node (int _id, int _r) : id(_id), r(_r) {}
bool operator < (const Node& rhs) const
{
return l < rhs.l || (l == rhs.l && r < rhs.r);
}
}a[maxn];
int vis[maxn], id[maxn];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n; scanf("%d", &n);
for(int i = ; i < n; i++) scanf("%d", &a[i].l), a[i].id = i, vis[i] = ;
for(int i = ; i < n; i++) scanf("%d", &a[i].r);
sort(a, a+n);
priority_queue<pii, vector<pii>, greater<pii> > pq;
int cur = , cnt = ;
while()
{
while(cur < n && a[cur].l <= cnt)
pq.push(pii(a[cur].r, a[cur].id)), cur++; while(!pq.empty() && cnt > (pq.top()).first)
pq.pop(); if(!pq.empty())
{
vis[pq.top().second] = ;
id[cnt++] = pq.top().second;
pq.pop();
}
else break;
}
printf("%d\n", cnt);
for(int i = ; i < n; i++)
if(!vis[i])
id[cnt++] = i;
for(int i = ; i < cnt; i++)
{
if(i) printf(" ");
printf("%d", id[i]+);
}
printf("\n");
}
return ;
}

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

  1. jQuery之父:每天都写点代码

    去年秋天,我的“兼职编程项目”遇到了一些问题:要不是从 Khan Academy 的项目里挪出时间来的话,我根本没办法将不理想的进度弥补上. 这些项目遇到了一些严重的问题.之前的工作我主要是在周末,有 ...

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

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

  3. php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组)

    php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组) 一.总结 牛客网和洛谷一样,是真的好用 二.php重建二叉树 输入某二 ...

  4. ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas

    ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...

  5. 人人都写过的5个Bug!

    大家好,我是良许. 计算机专业的小伙伴,在学校期间一定学过 C 语言.它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理.操作系统.内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候, ...

  6. C++STL手写版

    手写STL,卡常专用. node为变量类型,可以自由定义,以下不再赘述. 1.stack(栈) 开一个数组,和一个top指针,压栈时++,弹栈时--即可. struct stack{ int tp;n ...

  7. 转C++之stl::string写时拷贝导致的问题

    前几天在开发某些数据结构到文件的 Dump 和 Load 功能的时候, 遇到的一个 bug . [问题复现] 问题主要出在 Load 过程中,从文件读取数据的时候, 直接使用 fread 的去操作 s ...

  8. css文件都写在一个里面还是每个页面都引用单独的css样式好?

    因为网站比较小,外加网站页面有很多重复构件,决定采用“构件复用”搭建网页,但是遇到了一个问题.因为虽然有共同的css,但是每个页面或多或少都有独立的样式控制,到底是写在同一个css还是分离看上去清楚一 ...

  9. Delphi/C#之父首次访华:55岁了 每天都写代码

    Delphi.C#之父Anders Hejlsberg 近日首次访华,并在10月24日和27日参加了两场见面会,分享了他目前领导开发的TypeScript项目,并与国内前端开发者近距离交流.本文就为读 ...

随机推荐

  1. [iOS 多线程 & 网络 - 3.0] - 在线动画Demo

    A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看   code source: https://github.com/hellovoidworld/Vid ...

  2. 《数据通信与网络》笔记--SCTP

    SCTP(stream control transmission protocol)是一种新的可靠的,面向报文的传输层控制协议.它兼有UDP和TCP的特性,它是可靠的面向报文的协议,它保存报文的边界, ...

  3. plsql developer导入导出数据库方法

    导出步骤: 1 tools ->export user object 选择选项,导出.sql文件 2 tools ->export tables-> Oracle Export 选择 ...

  4. ie6的兼容问题及解决方案

    1.png24位的图片在ie6浏览器上会出现背景,解决方案是做成png8位: 2.浏览器默认的margin和padding不同,解决方法是用全局重置来统一,即是*{margin:0;padding:0 ...

  5. 一,彻底理解第一个C语言程序 Hello World

    对于初学者来说,第一个程序一般都是hello world,而且是照着书上一点一点敲的.所以,在初学者眼中,敲出来的第一个程序代码不过是一堆看不懂的英语.而事实上,C语言作为一门语言,是有语法的.所以这 ...

  6. 理解Windows中的路由表和默认网关

    每一个Windows系统中都具有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息.路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制. 理 ...

  7. 搭建sentry(一个分布式日志聚合系统)

    简介: Sentry 是一个实时的事件日志和聚合平台,基于 Django 构建. Sentry 可以帮助你将 Python 程序的所有 exception 自动记录下来,然后在一个好用的 UI 上呈现 ...

  8. Codeforces Beta Round #51 D. Beautiful numbers 数位dp

    D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...

  9. C++ AfxBeginThread1

    9*9乘法口诀 关键点 实现过程 在 class CMfc01Dlg : public CDialog {     // Construction public:     CMfc01Dlg(CWnd ...

  10. hive 经常使用命令

    1.查看表结构信息   desc formatted table_name;   desc table_name; 查看关联文件: desc extended f_tblog_online_mds; ...