题目链接

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;
}

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

最新文章

  1. FFmpeg学习6:视音频同步
  2. nvm诡异的报错
  3. jquery 巧用json传参
  4. page resizing
  5. JSP Session管理
  6. 继承View绘制正方形且360旋转
  7. ionic 手机端如何嵌入视频iframe
  8. 用extern关键字使程序更加清晰
  9. Kettle 5.0源码编译
  10. 机器学习之支持向量机(SVM)
  11. 让git不再跟踪配置文件的变化
  12. javaSocket笔记
  13. 处理Task引发的异常
  14. (第三周)使用visual studio 2015进行单元测试
  15. office 2010 正在配置Microsoft Office ...
  16. http协议基础(八)请求首部字段
  17. 常用的SLAM解决方案
  18. GitHub 多人协作开发 三种方式:
  19. C++:const用法的简单总结
  20. MYSQL学习笔记 (四)GROUP BY与HAVING用法

热门文章

  1. kotlin 泛型约束
  2. 关于Java 8新引入语法特性的简要说明
  3. ELK的安全解决方案 X-Pack(1)
  4. 使用druid连接池带来的坑testOnBorrow=false
  5. 004-log-common-logging,Apache整合日志框架JCL门面框架、JCL+log4j
  6. smart_pointer example
  7. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_16-异常处理-可预知异常处理-自定义异常类型和抛出类
  8. failOnMissingWebXml
  9. 阿里巴巴java规则p3c结合sonar使用
  10. Flutter 异步Future与FutureBuilder实用技巧