比赛链接:
https://ac.nowcoder.com/acm/contest/11225
C.可疑的区间
题目大意:
\(n\) 个区间,给出一个整数 \(len\),一个长度为 \(len\) 的区间的有趣值为与它有交集的区间的个数,它的权重为与它有交集的区间的编号之和。
牛牛会选择一个长度为 \(len\) 的可疑区间,可疑区间是有趣值最大的区间,如果有趣值相同,则是其中权重最大的那些,问有几个可疑区间。
思路:
用两个差分数组分别维护有趣值和权重,然后一遍循环找到可疑区间的起点的个数即可。
代码:
#include <bits/stdc++.h>
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;
}