题目链接

https://cn.vjudge.net/problem/HDU-5124

胡扯

感觉说新方法好像有点不太好,但是翻了十几篇博客都是清一色离散化之类的...

为什么会做这道题呢?因为前几天做了套NOIp模拟赛,T1是坐标轴上的最大团,愉快地转化成最多不相交区间问题贪心处理

但是我把大于等于号看反了,以为区间相交才连边,于是转化成了"让你找出被覆盖次数最多的点(线段)被覆盖的次数",也就是这题

然后考场上yy出了一个堆+贪心的鬼畜做法,对拍过了,以为能AC,结果......爆0了,很angry,于是找到了这道题,用yy出来的新算法交了一发居然就A了,跑得还不错?要是手写堆的话可能更快

分析

我先以左端点为第一关键字,右端点为第二关键字排序,然后遍历所有区间\(seg\)

遍历中\(pos\)记录当前满足\(seg[i].l<=pos\)所有区间的最大右端点值,如果新加入的区间左端点大于pos,pos置为\(seg[i].r\),\(cnt\)重置为1

一个小根堆维护刚刚那些\(seg[i].l<=pos\)所有区间的右端点值,如果当前新加入的区间左端点大于堆顶值,弹出堆顶,同时\(cnt-1\),反复操作直到不满足大于或是堆为空,接着更新答案.

排序\(NlogN\),每个区间最多被弹出一次因此遍历一遍\(NlogN\),因此总时间复杂度\(O(N logN)\),本来想用Two Pointer但是好像不行

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <queue>
#define ll long long
#define ri register int
using std::min;
using std::max;
using std::vector;
using std::priority_queue;
using std::sort;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=100005;
const ll inf=1e17;
struct Seg{
ll l,r;
bool operator <(const Seg &b)const{
return l==b.l?r<b.r:l<b.l;
}
}seg[maxn];
int n;
priority_queue <ll, vector<ll> ,std::greater<ll> >q;
int main(){
ll x,len,l,r;
int T;
read(T);
while(T--){
while(q.size())q.pop();
read(n);
for(ri i=1;i<=n;i++){
read(l),read(r);
seg[i].l=l,seg[i].r=r;
}
sort(seg+1,seg+1+n);
ll pos=-inf;
int ans=0,cnt=0,lst=0;
for(ri i=1;i<=n;i++){
if(seg[i].l>pos){
while(q.size())q.pop();
pos=seg[i].r;
ans=max(ans,cnt);
cnt=1;
}
else cnt++;
q.push(seg[i].r);
if(seg[i].r>pos)pos=seg[i].r;
if(q.size())lst=q.top();
while(seg[i].l>lst&&q.size()){
q.pop();cnt--;
if(!q.empty())lst=q.top();
}
ans=max(ans,cnt);
}
printf("%d\n",ans);
}
return 0;
}

考试看错你会做的题的感觉真....难受

HDU5124lines题解-堆+贪心的一个新方法的更多相关文章

  1. iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;

    NSArray 里面的一个方法, - (void)makeObjectsPerformSelector:(SEL)aSelector: 这是一个类似于执行for循环的方法,可以这样用,当需要删除一个v ...

  2. 字符串的新方法——includes() padStart() padEnd()

    ES6为字符串提供了一个新方法,叫做String.prototype.includes('要包含的字符串'),如果包含,则返回字符串,否则返回false 使用ES6中的字符串新方法String.pro ...

  3. vue学习(十四) 条件搜索框动态查询表中数据 数组的新方法

    //html <div id="app"> <label> 名称搜索关键字: <input type="text" clasa=& ...

  4. AspectJ之@DeclareParents注解为对象添加新方法

    众所周知,AspectJ可以通过@Before,@After,@Around等注解对连接点进行增强,今天我们来玩一个新注解@DeclareParents.对目标对象增强一个新方法. 场景引入: 现在我 ...

  5. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  6. 【转】一个新的UIButtonMessage 给NGUI,使用委托,自动选择Receiver提供的方法

    http://blog.csdn.net/chiuan/article/details/9290651?utm_source=tuicool&utm_medium=referral 来分享一个 ...

  7. Hibernate的多表查询,分装到一个新的实体类中的一个方法

    不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...

  8. concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

    var arr1 = ['a', 'b', 'c']; var arr2 = ['d', 'e', 'f']; var arr3 = arr1.concat(arr2); // arr3 is a n ...

  9. 《笔记篇》非JS方法跳转到一个新页面,主要防止客户端禁止浏览器JS以后的跳转异常

    用非JS方法打开一个新页面,主要防止客户端禁止浏览器JS以后的跳转失效 <meta http-equiv="refresh" content="0; url=htt ...

随机推荐

  1. vue实现购物清单列表添加删除

    vue实现购物清单列表添加删除 一.总结 一句话总结: 基础的v-model操作,以及数组的添加(push)删除(splice)操作 1.checkbox可以绑定数组,也可以直接绑定值? 绑定数组就是 ...

  2. 推送kafka消息失败

    晚上变更 怎么都推不过去,蛋疼,睡饱后加了个hosts没想到好了,然后搜了一下,大概是如下的原因 转自 https://www.cnblogs.com/linlianhuan/p/9258061.ht ...

  3. 分布式系统的应用程序性能监视工具,专为微服务、云本机架构和基于容器(Docker、K8s、Mesos)架构而设计。 SkyWalking

    Apache SkyWalking™ | SkyWalking Teamhttp://skywalking.apache.org/zh/ Application performance monitor ...

  4. Heat map 绘图神奇

    https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149(博主视频教学主 ...

  5. mfc通过信号量保证线程同步

    1.声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2.创建信号量 uiHandle = CreateSemaphore(NULL,1,1,NULL); ...

  6. 【转】【很全很新】C3P0 连接池和 DBUtils 配合事务使用总结

    [转]https://blog.csdn.net/guozhaohui628/article/details/84793028 很久没用原生连接池,最近想写个小功能,结果发现很多地方不太懂,然后网上搜 ...

  7. linux操作备份

    ---------------------------------------------------------------------------------------------------- ...

  8. 取消一个本地svn目录与svn的联系

    第一种方法: 直接.逐级地删除目标目录中的隐藏属性的.svn目录 这个方法试了,好牛蛋...,省事,快速... 第二种方法: 如果用的是TortoiseSVN客户端,则先在另外一处建立一个新目录A,右 ...

  9. swift 第十二课 as 的使用方法

    忽略的基础性的问题,应该早点写出这个问题的解释比较好,毕竟 swift 好多的地方都用到了 as as!as?,是非常容易搞晕大脑的 1,as使用场合          (1)从派生类转换为基类,向上 ...

  10. 【ABAP系列】SAP ABAP 高级业务应用程序编程(ABAP)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 高级业务应用程 ...