题意

有n个区间,要求删除一些区间使得不存在三个相交的区间。找出删除的最少区间。

分析

是个比较显然的贪心吧。

先按照区间的左起点进行排序,然后从左往右扫,当有三个区间相交的时候,删除那个右端点最远的那个区间。

这个想法显然是没错的,但是问题是n最大是50000,我们该怎么在时间复杂度以内边扫边找相交区间呢?

我们可以在从左到右扫的时候维护一个vector,里面是到目前为止,右端点最远的三个区间。我们判断相交是要从这里面判断就可以。当这里面的三个区间相交的时候,根据上面的规则删除,当不想交的时候,把新区间加进来,去掉右端点最近的一个(但是并不是删除,只是从这个vector中删除而已)。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <set>
 6 #include <map>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #include <iostream>
11 #include <cmath>
12
13 using namespace std;
14 typedef long long LL;
15 typedef unsigned long long ull;
16 const int INF=2147483600;
17 const int maxn=50000+100;
18
19 struct Node{
20     int l,r,id;
21     bool vis;
22     bool operator <(const Node &rhs)const{
23         return l<rhs.l;
24     }
25 }node[maxn];
26 int T,n;
27 int main(){
28     scanf("%d",&T);
29     for(int t=1;t<=T;t++){
30         scanf("%d",&n);
31         for(int i=1;i<=n;i++){
32             scanf("%d%d",&node[i].l,&node[i].r);
33             node[i].id=i;
34             node[i].vis=0;
35         }
36         sort(node+1,node+1+n);
37         vector<Node>V;
38         int num;
39         vector<int>ans;
40
41         for(int i=1;i<=n;i++){
42             //cout<<node[i].l<<" "<<node[i].r<<endl;
43             V.push_back(node[i]);
44             if(V.size()<3)continue;
45             sort(V.begin(),V.end());
46
47             if(V[0].r>=V[1].l&&V[2].l<=V[1].r&&V[2].l<=V[0].r){
48                 int M=-1;
49                 M=max(M,max(max(V[0].r,V[1].r),V[2].r));
50                 vector<Node>::iterator it;
51                 for( it=V.begin();it!=V.end();it++){
52                     if(it->r==M){
53                         ans.push_back(it->id);
54                         V.erase(it);
55                         break;
56                     }
57                 }
58             }
59             if(V.size()>=3){
60                 int M=INF;
61                 for(int i=0;i<3;i++){
62                     M=min(M,V[i].r);
63                 }
64                 vector<Node>::iterator it;
65                 for(it=V.begin();it!=V.end();it++){
66                     if(it->r==M){
67                         V.erase(it);
68                         break;
69                     }
70                 }
71             }
72         }
73         printf("%d\n",ans.size());
74         sort(ans.begin(),ans.end());
75         for(int i=0;i<ans.size();i++){
76             if(i!=0)printf(" ");
77             printf("%d",ans[i]);
78         }
79         if(ans.size()!=0)
80             printf("\n");
81     }
82     return 0;
83 }

View Code

转载于:https://www.cnblogs.com/LQLlulu/p/8932552.html

ZOJ3953 Intervals相关推荐

  1. ZOJ-3953 Intervals,t

    Intervals 题意:给出n个区间,求最少删除多少个区间使得任意三个区间都不相交. 思路:按区间左端点排序,每次选取r最大的两个与当前比较,如果能放更新r,否则删除r最大的.关键就在怎么删除r最大 ...

  2. R语言ggplot2可视化:置信区间与分组具有相同色彩、自定义置信区间带的色彩、Make confidence intervals the same color as line by group

    R语言ggplot2可视化:置信区间与分组具有相同色彩.自定义置信区间带的色彩.Make confidence intervals the same color as line by group 目录

  3. 置信区间(Confidence Intervals)是什么?如何计算置信区间?置信区间的两种计算方法是什么?二值样本置信区间如何计算?如何基于bootstrap抽样进行置信区间计算?

    置信区间(Confidence Intervals)是什么?如何计算置信区间?置信区间的两种计算方法是什么?二值样本置信区间如何计算?如何基于bootstrap抽样进行置信区间计算? 目录 置信区间( ...

  4. LeetCode 56. Merge Intervals

    原题链接在这里:https://leetcode.com/problems/merge-intervals/ 题目: Given a collection of intervals, merge al ...

  5. Merge Intervals

    代码: 1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 5 using namesp ...

  6. LeetCode Merge Intervals

    Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...

  7. LeetCode:Merge Intervals

    题目链接 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6 ...

  8. POJ 1201 amp; HDU1384 amp; ZOJ 1508 Intervals(差分约束+spfa 求最长路径)

    题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...

  9. LeetCode-56-Merge Intervals

    算法描述: Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2, ...

  10. [LeetCode]Merge Intervals

    题目:Merge Intervals 给定n个区间合并重合区间 思路: 先按照区间起点排序,然后合并下面情况: 1.起点相同,以最大的终点为新的终点: 2.前一个终点大于后一个的起点. /****** ...

最新文章

  1. python tkinter 下拉框_python中tkinter入门之Menu创建顶级菜单、下拉菜单和弹出菜单。...
  2. Win2008 R2实战之只读域控制器部署(图)
  3. maven热部署插件-jetty
  4. prim算法_贪心算法详解(附例题)
  5. Workspace in use or cannot be created, choose a different one.--错误解决办法
  6. 如何关闭小娜进程_Python多进程之进程间通信 - Pipe amp; Queue
  7. 优秀的弹窗插件 jquery.lightbox_me.js
  8. java 启动参数 配置_Java运行参数设置
  9. c语言贪吃蛇设计意义,C语言贪吃蛇设计理念.pdf
  10. visio2019安装教程
  11. 计算机电路与电子学试卷,电路与电子学(第5版)学习指导与习题解答
  12. 计算机控制技术论文英语版,计算机控制技术外文论文
  13. oracle 获取日期的毫秒_Oracle 毫秒时间戳
  14. 大数据分析的“数据来源”有哪些?
  15. 相邻图片之间有空白间隙的问题解决
  16. oracle rac 关闭asm,11G rac的ASM无法关闭
  17. 戴尔电脑如何下载c语言,EqualLogic PS6000:戴尔的突破、机遇和挑战
  18. 新智慧杂志新智慧杂志社新智慧编辑部2022年第9期目录
  19. c语言错误 243什么意思,c语言编译后[Error] stray apos;\243apos; in program
  20. 【参赛作品12】基于华为云鲲鹏弹性云服务器部署openGauss数据库-实验

热门文章

  1. 拓端tecdat|R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)
  2. 顺序栈实现迷宫求解问题v0.1
  3. iview 自定义时间选择器组件_视图更新科技发布View UI组件库(即 iView 4.0),超过50项更新...
  4. Python破解验证码,只要15分钟就够了!
  5. python数字图像处理(12):基本图形的绘制
  6. 机器学习(六)——PCA降维处理
  7. flutter text 左对齐_【Flutter学习】基本组件之文本组件Text
  8. 如何操作反射中构造方法、属性和普通方法?
  9. DevOps使用教程 华为云(6)文档报告 项目进度 会议记录 迭代评审
  10. python调用shell命令 批量执行python程序