区间(interval)

【问题描述】
给定 N 个区间, 要求选出若干个区间 A1, A2, A3... Am (m > 1), 使得:
|A1∩A2∩A3...∩Am| * |A1∪A2∪A3...∪Am|
最大。
【输入格式】
第一行一个整数 N
接下来 N 行,每行 2 个整数 L, R, 描述一个区间。
【输出格式】
一个数, 为该式最大值。
【输入样例】
4
1 6
4 8
2 7
3 5
【输出样例】
24
【样例解释】
选(1, 6)和(2, 7)
【数据范围】
30% N≤1000
100% N≤1000000
100% L,R≤10 6

首先m=2即可取到最优解(一定).
对区间按左端点第一关键字, 右端点第二关键字排序.
维护一个单调栈. 栈内区间的长度单调递减.
每次退栈头时, 用栈头和压退栈头的区间更新答案. 
压入栈头的时候用原栈头和新栈头更新.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 struct Interval
 7 {
 8   long long l,r;
 9 }a[1000001];
10 int q[1000001],n;
11 long long ans;
12 bool cmp(Interval a,Interval b)
13 {
14   return (a.l<b.l||(a.l==b.l&&a.r<b.r));
15 }
16 long long count(int x,int y)
17 {
18   if (y==0) return 0;
19   return (min(a[x].r,a[y].r)-max(a[x].l,a[y].l))*(max(a[x].r,a[y].r)-min(a[x].l,a[y].l));
20 }
21 int main()
22 {int i,j,tail=0;
23   cin>>n;
24   for (i=1;i<=n;i++)
25     {
26       scanf("%lld%lld",&a[i].l,&a[i].r);
27     }
28   sort(a+1,a+n+1,cmp);
29   for (i=1;i<=n;i++)
30     {
31       while (tail&&a[q[tail]].r-a[q[tail]].l<=a[i].r-a[i].l)
32     {
33       ans=max(ans,count(i,q[tail]));
34       tail--;
35     }
36       tail++;
37       ans=max(ans,count(i,q[tail-1]));
38       q[tail]=i;
39     }
40    cout<<ans;
41 }
时间: 2024-08-25 17:42:51

区间(interval)的相关文章

LeetCode: Insert Interval [056]

[题目] Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Example 1: Given intervals [1,3],[6,9], insert and m

论文式编程

文学编程 文学编程(Literate programming)的一些概念,上个世纪 70 年代就有人提出来了. 文学编程的思想非常简单,就是将那些为了能被编译器/解释器正确识别而编写的代码打碎,然后用人类语言将它们编织到文档中,这种文档就是文学编程的源文件.这一概念第一次被完整的实现,是 Knuth 开发的 WEB 工具(此 WEB 并非现代漫天飞舞的那个 Web).Knuth 的神作——TeX 系统便是借助 WEB 开发的. WEB 工具由 tangle 与 weave 这两个程序构成.tan

[Java]leetcode56 Merge Intervals

Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 题意是:给定上面的区间范围,然后将区间上有交叉的部分进行融合.这一题需要注意的区间的开始可能不是递增的,也就是有可能[1,2],[4,6],[0,6]的情况. 之前也遇到过这样的题,想着用数组的方式去解题,感觉很复杂

Ceph源码解析:PG peering

集群中的设备异常(异常OSD的添加删除操作),会导致PG的各个副本间出现数据的不一致现象,这时就需要进行数据的恢复,让所有的副本都达到一致的状态. 一.OSD的故障和处理办法: 1. OSD的故障种类: 故障A:一个正常的OSD 因为所在的设备发生异常,导致OSD不能正常工作,这样OSD超过设定的时间 就会被 out出集群. 故障B: 一个正常的OSD因为所在的设备发生异常,导致OSD不能正常工作,但是在设定的时间内,它又可以正常的工作,这时会添加会集群中. 2. OSD的故障处理: 故障A:O

hdu 6119 小小粉丝度度熊

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1299    Accepted Submission(s): 419 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

【数据挖掘导论】——数据类型

数据类型 数据集的不同表现在很多方面.例如:描述数据对象的属性可有具有不同的类型--定量的或者定性的.并且数据集可能还具有特定的性质,如包含时间序列或者彼此相关联.这因为如此,数据的类型决定我们应使用何种工具和技术来分析数据.此外,数据挖掘的研究也是为了适应新的应用领域和新的数据类型. 数据的质量 数据通常远非完美,尽管大部分的数据挖掘技术都容忍不完美的数据,但注重理解和提高数据质量将是改进精确分析结果的重要途径之一. 使数据适合挖掘的预处理步骤 通常,原始数据必须经过加工才能适合分析.而加工处

12306出票算法随想

引言 每逢假日人流高峰,12306便会成为一个热门的话题,2016的春节也毫无例外.大年初二,我和汤雪华(NetFocus)一干人等,在QQ群里围绕12306的购票问题展开了热烈的讨论.最后,由于购票问题远比想象中复杂,所以最终还是公说公有理.婆说婆有理,没有得到一个较为清晰和明确的结果.于是决定动动笔,谈一谈自己的理解,重点是解决面对购票请求时能不能出票的问题.如果我的方法有漏洞,请一定指出,谢谢! 需要说明的是,我的离散数学和组合数学的知识,都早早地还给了我的体育老师,所以下面的这个算法可能

工作中的英语积累8

1.单位,基准  module 2.乘法  multiplication 3.事件   occurrence 4.页面失效   page  fault 5.队列   queue 6.会话层   session layer 7.变量  variable 8.加法器   adder 9.字符  character 10.方程式,等式   equation 11.询问   inquiry 12.解释   to interpret 13.模拟,仿真   simulation 14.随机存储   rand

一些数学名词的笔记

算数(arithmatic): 代数(algebra): 初等代数(elementary algebra): 抽象代数(abstract algebra) 几何(geometry) 数论(number thoery) 群(group) 环(ring):一个代数结构,定义了广义化的算数加和乘运算 域(field) 数学分析(mathmatical analysis):数学的一个分支,包括了微分.积分.测度.极限.无穷级数.解析函数等内容. 复分析(complex analysis) 实分析(rea