牛客小白月赛48


比赛链接:

https://ac.nowcoder.com/acm/contest/11225

C.可疑的区间

题目大意:

\(n\) 个区间,给出一个整数 \(len\),一个长度为 \(len\) 的区间的有趣值为与它有交集的区间的个数,它的权重为与它有交集的区间的编号之和。
牛牛会选择一个长度为 \(len\)可疑区间,可疑区间是有趣值最大的区间,如果有趣值相同,则是其中权重最大的那些,问有几个可疑区间。

思路:

用两个差分数组分别维护有趣值和权重,然后一遍循环找到可疑区间的起点的个数即可。

代码:

#include 
using namespace std;
#define LL long long
const int N = 5e6 + 10;
LL n, len, l, r, ans, cnt[N], s[N], mx1, mx2;
int main(){
	cin >> n >> len;
	for (int i = 1; i <= n; i ++ ){
		cin >> l >> r;
		l = max(1LL, l - len + 1);
		cnt[l]++;
		cnt[r + 1]--;
		s[l] += i;
		s[r + 1] -= i;
	}
	for (int i = 1; i <= N - 10; i ++ ){
		cnt[i] += cnt[i - 1];
		s[i] += s[i - 1];
		if (cnt[i] > mx1 || (cnt[i] == mx1 && s[i] > mx2)){
			mx1 = cnt[i];
			mx2 = s[i];
			ans = 0;
		}
		if (cnt[i] == mx1 && s[i] == mx2) ans++;
	}
	cout << ans << "\n";
	return 0;
}