【优先队列】【最近连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项目,并与国内前端开发者近距离交流.本文就为读 ...
随机推荐
- BAT-使用BAT方法删除目录下0KB文件
@Echo Off For /f "tokens=*" %%i in ('dir /a-d /b /s "*.*"') do ( If " (Del ...
- POJ 2349 Arctic Network (最小生成树)
Arctic Network 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/F Description The Departme ...
- jquery easyui的方法参数
1.form 表单的参数有:submit,validate,clear,load 2.submit 例如: $('#goods-add').form('submit', { url : url, on ...
- c++结束进程的程序
//#include <winbase.h> #include <windows.h> #include <process.h> #include <Tlhe ...
- Vieta定理
一元$n$次方程$$P(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+\cdots+a_{a}x+a_{0}=a_{n}(x-x_{1})(x-x_{2})\cdots (x-x_{n}) ...
- java foreach编辑讲解
foreach语句使用总结 foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简化版本,但是foreac ...
- 直接下载Google Play市场的APK
传送门在这里:http://apps.evozi.com/apk-downloader/ 似乎很方便.很迅速的样子,忍不住在这里记录一下.
- androidstudio can't run git.exe
今天用android studio从git下载项目的时候遇到一个问题,提示说can't run git.exe 问了下度娘以及谷歌.但是无果,后面捣鼓了一阵,下了一个git windows版本后,在a ...
- 使用sql生成UUID
在SQLServer中使用该sql语句可以生成GUID:select cast(NEWID() as varchar(36)) as uuid 通过一下语句将GUID中的'-'字符去掉: select ...
- Html页中使用OCX控件
原文:http://blog.csdn.net/mouse8166/article/details/5515657 最近准备开发一个b/s架构的应用程序需要用到activeX控件,web服务器尚未进入 ...