Aizu - 1386 Starting a Scenic Railroad Service (思维乱搞)

给你n个区间,求:

1:最多有多少区间与同一个区间相交。

2:相交部分的最大区间数目。

Sample Input 1
4
1 3
1 3
3 6
3 6

Sample Output 1
2 2


Sample Input 2
4
1 2
2 3
1 3
3 4

Sample Output 2
3 2


Sample Input 3
10
84 302
275 327
364 538
26 364
29 386
545 955
715 965
404 415
903 942
150 402

Sample Output 3
6 5

  

 

第二个问题可以直接用差分解决。(区间修改)

第一个问题:

对于每一个区间,统计在它左端点前面的右端点的数目,和在它右端点前面的左端点的数目。

然后与它相交的区间数 = 后者 - 前者。(!!!)

这样用两个前缀和,一个统计左端点数,一个统计右端点数就可以了。

 

 

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int maxn = 200000 + 100;
const int N = 100000;

int n;
int a[maxn], b[maxn];
int cnt[maxn], up[maxn], down[maxn];

int main()
{
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
    {
        scanf("%d%d", &a[i], &b[i]);
        cnt[a[i]]++, cnt[b[i]]--;
        up[a[i]]++, down[b[i]]++;
    }

    int ans1 = 0, ans2 = 0;
    for (int i = 1; i <= N; i++)
    {
        cnt[i] += cnt[i-1];
        up[i] += up[i-1], down[i] += down[i-1];
        ans2 = max(ans2, cnt[i]);
    }

    for (int i = 1; i <= n; i++)
        ans1 = max(ans1, up[b[i]-1] - down[a[i]]);

    printf("%d %d\n", ans1, ans2);
}

 

posted @ 2018-08-27 21:25  jvruodejrLS  阅读(355)  评论(0编辑  收藏  举报

Contact with me