题目链接: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\n", Max); } return 0; }
时间: 2024-10-31 12:03:26