题目类型
关于差分和前缀和
主要解决思路
最主要的思路是通过差分+前缀和的方法进行数据区间的标注。 如何获取正确的次数,我们可以通过记录每一个点访问的次数来看,访问次数最多的区间范围就是最后正确数字落入的范围。最后相当于返回最大的访问次数。
特别注意
1.注意数据的范围!!!,刚开始我将最大区间长度定义为1e9发现长度不够,因此只有40%的通过率。 2.需要定义一个map<int, int> diff;优势是可以保存负数,并且占用内存小
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
#define MAX 2147483647
// int v[100010];
map<int, int> diff;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int num;
char dot;
cin >> num >> dot;
if (dot == '.') {
diff[num]++;
diff[num + 1]--;
} else if (dot == '+') {
diff[-MAX]++; // 相当于负无穷
diff[num]--;
} else if (dot == '-') {
diff[num + 1]++;
diff[MAX]--; // 相当于正无穷
}
}
int max_overlap = 0;
int current = 0;
for (auto &[pos, delta] : diff) {
current += delta;
max_overlap = max(max_overlap, current);
}
cout << max_overlap << endl;
return 0;
}