HDU5124lines题解-堆+贪心的一个新方法
题目链接
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题解-堆+贪心的一个新方法的更多相关文章
- iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;
		NSArray 里面的一个方法, - (void)makeObjectsPerformSelector:(SEL)aSelector: 这是一个类似于执行for循环的方法,可以这样用,当需要删除一个v ... 
- 字符串的新方法——includes()  padStart()   padEnd()
		ES6为字符串提供了一个新方法,叫做String.prototype.includes('要包含的字符串'),如果包含,则返回字符串,否则返回false 使用ES6中的字符串新方法String.pro ... 
- vue学习(十四)  条件搜索框动态查询表中数据 数组的新方法
		//html <div id="app"> <label> 名称搜索关键字: <input type="text" clasa=& ... 
- AspectJ之@DeclareParents注解为对象添加新方法
		众所周知,AspectJ可以通过@Before,@After,@Around等注解对连接点进行增强,今天我们来玩一个新注解@DeclareParents.对目标对象增强一个新方法. 场景引入: 现在我 ... 
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
		洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ... 
- 【转】一个新的UIButtonMessage 给NGUI,使用委托,自动选择Receiver提供的方法
		http://blog.csdn.net/chiuan/article/details/9290651?utm_source=tuicool&utm_medium=referral 来分享一个 ... 
- Hibernate的多表查询,分装到一个新的实体类中的一个方法
		不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ... 
- concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
		var arr1 = ['a', 'b', 'c']; var arr2 = ['d', 'e', 'f']; var arr3 = arr1.concat(arr2); // arr3 is a n ... 
- 《笔记篇》非JS方法跳转到一个新页面,主要防止客户端禁止浏览器JS以后的跳转异常
		用非JS方法打开一个新页面,主要防止客户端禁止浏览器JS以后的跳转失效 <meta http-equiv="refresh" content="0; url=htt ... 
随机推荐
- LC 986. Interval List Intersections
			Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order ... 
- 如何用CSS3来实现卡片的翻转特效
			CSS3实现翻转(Flip)效果 动画效果 效果分析 当鼠标滑过包含块时,元素整体翻转180度,以实现“正”“反”面的切换. HTML分析 分析:.container,.flip为了实现动画效果做准备 ... 
- OpenStack Nova Release(Rocky to Train)
			目录 文章目录 目录 前言 演进方向 Cellv2 更新 Rocky Support disabling a cell Stein Handling a down cell Train Count q ... 
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_23-页面预览-页面预览开发
			1.用户进入cms前端,点击“页面预览”在浏览器请求cms页面预览链接. 2.cms根据页面id查询DataUrl并远程请求DataUrl获取数据模型. 3.cms根据页面id查询页面模板内容 4.c ... 
- matllab 按照文件夹处理文件
			folders=dir('文件夹地址'); folders={folders.name}; folders=setdiff(folders,{'.','..'})'; num=length(folde ... 
- PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)
			1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ... 
- swift 第六课 scrollview xib 的使用
			现在 xib,stroyBoard 这种图形话的编辑写代码,越来越简单.以前scrollview 这样的控件不会用xib ,网上查了 好多的资料.现在把步骤逐渐的写出来, 这里顺便写个Demo ,是一 ... 
- RESTful架构(Representational State Transfer资源表现层状态转换)
			1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ... 
- Outlook2016中如何实现自动密送
			Outlook2016中如何实现自动密送 下面的方案您可以参考一下: 1)在Outlook里面键入Alt+F11打开VBA编辑器: 2)激活左边的工程面板,展开并双击上面的“Project (VbaP ... 
- ansible实践
			ansible常用module ansible-doc -l List available modules -s Show playbook snippet for specified module( ... 
