lines---hdu5124(离散化+数组模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5124

就是有n条在x轴的线段,给你线段的左右端点,每条线段都会覆盖点,求出最多被覆盖多少次

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define N 201000

int b[N], v[N];

struct node
{
    int L, R;
}a[N];

int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        memset(v, 0, sizeof(v));
        int k=0, Max=0, ans=0;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%d %d", &a[i].L, &a[i].R);
            b[k++]=a[i].L;
            b[k++]=a[i].R;
        }///离散化处理;

        sort(b, b+k);
        k = unique(b, b+k)-b;///排序去重;

        for(int i=0; i<n; i++)
        {
            int L=lower_bound(b, b+k, a[i].L)-b;
            int R=lower_bound(b, b+k, a[i].R)-b;
            v[L]++;///相当于是入点++出点--;最后把v从前到后加在一起就相当于此点被加过几次;
            v[R+1]--;
        }

        for(int i=0; i<k; i++)
        {
            ans+=v[i];
            Max=max(Max, ans);///求最大的值;
        }
        printf("%d
", Max);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4946107.html