Codeforces Round #506 (Div. 3) C. Maximal Intersection

C. Maximal Intersection

time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given nn segments on a number line; each endpoint of every segment has integer coordinates. Some segments can degenerate to points. Segments can intersect with each other, be nested in each other or even coincide.

The intersection of a sequence of segments is such a maximal set of points (not necesserily having integer coordinates) that each point lies within every segment from the sequence. If the resulting set isn‘t empty, then it always forms some continuous segment. The length of the intersection is the length of the resulting segment or 00 in case the intersection is an empty set.

For example, the intersection of segments [1;5][1;5] and [3;10][3;10] is [3;5][3;5] (length 22), the intersection of segments [1;5][1;5] and [5;7][5;7] is [5;5][5;5](length 00) and the intersection of segments [1;5][1;5] and [6;6][6;6] is an empty set (length 00).

Your task is to remove exactly one segment from the given sequence in such a way that the intersection of the remaining (n?1)(n?1)segments has the maximal possible length.

Input

The first line contains a single integer nn (2≤n≤3?1052≤n≤3?105) — the number of segments in the sequence.

Each of the next nn lines contains two integers lili and riri (0≤li≤ri≤1090≤li≤ri≤109) — the description of the ii-th segment.

Output

Print a single integer — the maximal possible length of the intersection of (n?1)(n?1) remaining segments after you remove exactly one segment from the sequence.

Examples

input

Copy

41 32 60 43 3

output

Copy

1

input

Copy

52 61 30 41 200 4

output

Copy

2

input

Copy

34 51 29 20

output

Copy

0

input

Copy

23 101 5

output

Copy

7

Note

In the first example you should remove the segment [3;3][3;3], the intersection will become [2;3][2;3] (length 11). Removing any other segment will result in the intersection [3;3][3;3] (length 00).

In the second example you should remove the segment [1;3][1;3] or segment [2;6][2;6], the intersection will become [2;4][2;4] (length 22) or [1;3][1;3](length 22), respectively. Removing any other segment will result in the intersection [2;3][2;3] (length 11).

In the third example the intersection will become an empty set no matter the segment you remove.

In the fourth example you will get the intersection [3;10][3;10] (length 77) if you remove the segment [1;5][1;5] or the intersection [1;5][1;5] (length 44) if you remove the segment [3;10][3;10].

题意:给出n个区间,然后你可以删除一个区间,问你剩下的区间的交集的最大长度是多少

思路:我们回到原始的求所有区间的交集,其实就是      距离左边最近的右边界-距离右边最近的左边界

所以这个问题我们可以排个序,然后我们枚举要删除的边界,但是我们范围是10^5     n^2算法肯定不行,但我们又需要遍历,如果是nlogn的话肯定可以

这个时候我们可以考虑set,内有自动排序的功能,也是由红黑树组成优化了时间复杂度,但是说可能会记录重复的,那我们就要使用 multiset,和set的区别就在于能记录重复

然后我们枚举每个删除的区间即可

#include <bits/stdc++.h>
using namespace std;
int l[300005], r[300005];
multiset<int> a, b;
int main(){
    int n;
    scanf("%d", &n);
    for(int i=1;i<=n;i++){
        scanf("%d%d", &l[i], &r[i]);
        a.insert(l[i]);
        b.insert(r[i]);
    }
    int ans = 0;
    for(int i=1;i<=n;i++){
        a.erase(a.find(l[i]));
        b.erase(b.find(r[i]));
        ans = max(ans, *b.begin()-*a.rbegin());//取最大
        a.insert(l[i]);
        b.insert(r[i]);
    }
    printf("%d\n", ans);
}

还有种 优先队列的写法更加快

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
    int n,l[300010],r[300010];
    priority_queue<int> ml, mr;
    scanf("%d", &n);
    for (int i=0;i<n;++i) {
        scanf("%d %d", l+i, r+i);
        ml.push(l[i]);
        mr.push(-r[i]);
    }
    int ans = 0;
    bool bl, br;
    for (int i=0;i<n;++i) {
        bl = br = 0;
        if (ml.top()==l[i]) {
            bl = 1;
            ml.pop();
        }
        if (mr.top()==-r[i]) {
            br = 1;
            mr.pop();
        }
        ans = max(ans, -mr.top()-ml.top());
        if (bl) ml.push(l[i]);
        if (br) mr.push(-r[i]);
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Lis-/p/9533030.html

时间: 2024-10-09 00:10:22

Codeforces Round #506 (Div. 3) C. Maximal Intersection的相关文章

Codeforces Round #506 (Div. 3) C. Maximal Intersection (枚举)

[题目描述] You are given $n$ segments on a number line; each endpoint of every segment has integer coordinates. Some segments can degenerate to points. Segments can intersect with each other, be nested in each other or even coincide. The intersection of

Codeforces Round #506 (Div. 3) 题解

Codeforces Round #506 (Div. 3) 题目总链接:https://codeforces.com/contest/1029 A. Many Equal Substrings 题意: 给出长度为n的字符串,然后要求你添加一些字符,使得有k个这样的字符串. 题解: 直接暴力吧...一个指针从1开始,另一个从2开始,逐一比较看是否相同:如果不同,第一个指针继续回到1,第二个指针从3开始...就这么一直重复.最后如果第二个指针能够顺利到最后一位,那么记录当前的第一个指针,把他后面的

Codeforces Round #506 (Div. 3) D-F

Codeforces Round #506 (Div. 3) (中等难度) 自己的做题速度大概只尝试了D题,不过TLE D. Concatenated Multiples 题意 数组a[],长度n,给一个数k,求满足条件的(i,j)(i!=j) a[i],a[j]连起来就可以整除k 连起来的意思是 20,5连起来时205; 5,20连起来时520 n<=2*1e5,k<=1e9,ai<=1e9 愚蠢的思路是像我一样遍历(i,j)可能性,然后TLE,因为这是O(n^2) 可以先思考一简单问

Codeforces Round #506 (Div. 3) A-C

CF比赛题解(简单题) 简单题是指自己在比赛期间做出来了 A. Many Equal Substrings 题意 给个字符串t,构造一个字符串s,使得s中t出现k次;s的长度最短 如t="cat",k=3, minlen(s)=9,s=catcatcat 1<=len(t),k<=50 题解 稍加思考是个前缀等于后缀的问题,用kmp的next数组模板 假设t[0..l-1]==t[n-l....n-1] 那么应该不断重复t[l...n-1]这样的子串 代码如下(应该好好记住

Codeforces Round #506 (Div. 3)ABCDEF

并没有参加比赛,全是赛后AC A题 题意:现有一个长度为n的字符串s.你需要构建一个长度最小的字符串t,使得t中恰好包含k个s(允许部分重叠),输出这个字符串 1 /* 2 我们可以非常容易的发现我们构造出来的字符串t有着鲜明的特征.即t中有大量重复的子串,可以证明的是t = S + (K-1)*A, A是S串中删去一段字符串(这段字符串满足既是S的前缀又是S的后缀). 3 */ 4 #include<cstdio> 5 #include<iostream> 6 7 using n

Codeforces Round #315 (Div. 1)

A. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Rikhail Mubinchik believes that the current definition of prime numbers is obsolete as they are too complex and un

Codeforces Round #267 (Div. 2) C. George and Job(DP)补题

Codeforces Round #267 (Div. 2) C. George and Job题目链接请点击~ The new ITone 6 has been released recently and George got really keen to buy it. Unfortunately, he didn't have enough money, so George was going to work as a programmer. Now he faced the follow

Codeforces Round #261 (Div. 2) 459B. Pashmak and Flowers(数学题,组合)

题目链接:http://codeforces.com/problemset/problem/459/B B. Pashmak and Flowers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Pashmak decided to give Parmida a pair of flowers from the garden.

Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn LCA(最近公共祖先)

C. Lorenzo Von Matterhorn time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Barney lives in NYC. NYC has infinite number of intersections numbered with positive integers starting from 1. Ther