【优先队列】【最近连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++就会过;这两个的区别还是搞不懂。欢迎各路大神解惑。
附标程
#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的更多相关文章
- jQuery之父:每天都写点代码
去年秋天,我的“兼职编程项目”遇到了一些问题:要不是从 Khan Academy 的项目里挪出时间来的话,我根本没办法将不理想的进度弥补上. 这些项目遇到了一些严重的问题.之前的工作我主要是在周末,有 ...
- Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式
Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式 Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式 > ...
- php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组)
php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组) 一.总结 牛客网和洛谷一样,是真的好用 二.php重建二叉树 输入某二 ...
- ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas
? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...
- 人人都写过的5个Bug!
大家好,我是良许. 计算机专业的小伙伴,在学校期间一定学过 C 语言.它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理.操作系统.内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候, ...
- C++STL手写版
手写STL,卡常专用. node为变量类型,可以自由定义,以下不再赘述. 1.stack(栈) 开一个数组,和一个top指针,压栈时++,弹栈时--即可. struct stack{ int tp;n ...
- 转C++之stl::string写时拷贝导致的问题
前几天在开发某些数据结构到文件的 Dump 和 Load 功能的时候, 遇到的一个 bug . [问题复现] 问题主要出在 Load 过程中,从文件读取数据的时候, 直接使用 fread 的去操作 s ...
- css文件都写在一个里面还是每个页面都引用单独的css样式好?
因为网站比较小,外加网站页面有很多重复构件,决定采用“构件复用”搭建网页,但是遇到了一个问题.因为虽然有共同的css,但是每个页面或多或少都有独立的样式控制,到底是写在同一个css还是分离看上去清楚一 ...
- Delphi/C#之父首次访华:55岁了 每天都写代码
Delphi.C#之父Anders Hejlsberg 近日首次访华,并在10月24日和27日参加了两场见面会,分享了他目前领导开发的TypeScript项目,并与国内前端开发者近距离交流.本文就为读 ...
随机推荐
- uva 1356 Bridge ( 辛普森积分 )
uva 1356 Bridge ( 辛普森积分 ) 不要问我辛普森怎么来的,其实我也不知道... #include<stdio.h> #include<math.h> #inc ...
- POJ 2446 Chessboard (二分图最大匹配)
题目链接:http://poj.org/problem?id=2446 给你一个n*m的棋盘,其中有k个洞,现在有1*2大小的纸片,纸片不能覆盖洞,并且每个格子最多只能被覆盖一次.问你除了洞口之外这个 ...
- Lucene:信息检索与全文检索
目录 信息检索的概念 信息检索技术的分类 全文检索与数据库查询对比 全文检索工具一般由三部分构成 全文检索中建立索引和进行检索的流程 索引里面究竟存什么 如何创建索引 如何对索引进行检索 Lucene ...
- python list(列表)和tuple(元组)
200 ? "200px" : this.width)!important;} --> 介绍 python中存在两种有序的类型列表,分别是list(列表)和tuple(元组) ...
- Linux学习笔记----(2)
闲着无事,就敲起了Linux 命令,熟悉一下.记得昨天在书上看到了 find命令的用法,觉得挺神奇的. 其中 find 能够确定文件的查找深度 于是 敲了如下命令: #mkdir father #to ...
- assert
assert responseTP.length() > 0," TP response is empty, please check it "
- psp开发------汉化插件
近期略微研究了下psp汉化,写了个汉化插件,在这记录下.聊以慰藉. 传统的汉化流程找码表,字库,破解什么这里不多讲,网上有教程.以下说下一种另类汉化方法.特别对于难以破解字库的游戏,当然这样的方法也有 ...
- 【VBA研究】怎样将单元格数据赋给数组
作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种.一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句 ...
- Windows下codeblocks的安装与配置
最近自己正好要使用codeblocks编写C++程序,安装好却发现无法编译,如果您也遇到相似问题,可以参考本文. 如果您已安装codeblocks,想转换成中文界面,直接参考Step 2. 如果您C程 ...
- Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
一些机器学习算法的简介 本节开始,介绍<Computer Science Theory for the Information Age>一书中第六章(这里先暂时跳过第三章),主要涉及学习以 ...