显而易见的是我们要求的时间段重叠最多的次数。
用线段树也可以,不过既然是学习和练习前缀和与差分那么就用差分的思想。
在num[a]的位置+1 在num[y+1]位置-1 表示[a,b]区间有一个时间段。
最后统计一下num[i]最多的次数(i是1~n)
/************************************************************** Problem: 1651 User: LYFer Language: C++ Result: Accepted Time:100 ms Memory:4728 kb ****************************************************************/ #include <cstdio> #include <algorithm> #include <cstring> int n; int x,y; int a[1000005]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&x,&y); a[x]++; a[y+1]--; } int tot = 0 , ans = -1; for(int i=1;i<=1000001;i++){ tot+=a[i]; ans = std::max(ans,tot); } printf("%d\n",ans); return 0; }