区间的最大重叠次数

Posted 不积跬步无以至千里,不积小流无以成江海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间的最大重叠次数相关的知识,希望对你有一定的参考价值。

4009: Doges

时间限制: 1 Sec  内存限制: 256 MB
提交: 39  解决: 8
[提交][状态][讨论版]

题目描述

在一个遥远的地方,住着n只 Doge,它们分别被编号为1到n之间的正整数。

有一天,一个叫 Jrisme 的人来到这里,进行了一些「虐狗」行为。具体的,Jrisme 每次会虐编号连续的一些 Doge。现给出每次虐狗的区间,求最幸运(被虐次数最多)Doge 被虐了多少次。

输入

第一行两个正整数n和m,分别表示 Doge 的数量和 Jrisme 的虐狗次数。
从第二行开始,之后的m 行,第i行为两个正整数 li、ri,表示 Jrisme 虐了编号在区间 [li,ri]内的 Doge。

输出

一行一个整数,最幸运的 Doge 的被虐次数。

样例输入

10 3
1 4
4 7
4 9

样例输出

3

提示

对于 100%的数据,1≤n≤109,1≤m≤200000,1≤li≤ri≤n。

来源

LYOI2016 Summer

 1 #include<iostream>
 2 #include<algorithm>
 3 #include <cstdio>
 4 using namespace std;
 5 int  n,m;
 6 
 7 struct node
 8 {
 9     int TT,wi;
10 }a[400000+10];
11 int cmp(struct node x,struct node y)
12 {
13     if(x.TT==y.TT)
14         return x.wi>y.wi;
15     return x.TT<y.TT;
16 }
17 int main()
18 {
19     int Left,Right;
20     while(scanf("%d%d",&n,&m)!=EOF)
21     {
22         for(int i=0;i<m;i++)
23         {
24             scanf("%d%d",&a[i].TT,&a[i+m].TT);
25             a[i].wi = 1;
26             a[i+m].wi = -1;
27         }
28         sort(a,a+m*2,cmp);
29         int ans = -1;
30         int t=0;
31         int flag = 1;
32         for(int i=0;i<m*2;i++)
33         {
34             t += a[i].wi;
35             //ans = max(ans,t);
36             if(ans<t)
37             {
38                 Left = a[i].TT;
39                 ans = t;
40                 flag = 1;
41             }
42             else if(flag == 1)
43             {
44                 Right = a[i].TT;
45                 flag = 0;
46                 //cout<<"*********"<<Right<<endl;;
47             }
48 
49         }
50         printf("%d\n",ans);
51         //printf("%d %d\n",Left,Right);
52     }
53     return 0;
54 }

 

以上是关于区间的最大重叠次数的主要内容,如果未能解决你的问题,请参考以下文章

最大不重叠区间

重叠区间的最大子集数

使用间隔树的最大间隔重叠[关闭]

1133 不重叠的线段 (贪心算法,最大区间不重合问题)

51nod 1133 不重叠的线段 (贪心,序列上的区间问题)

51Nod 1091 线段重叠 贪心 区间重叠