最开始没看内存限制,写了朴素差分
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int main() {
int n,m;cin >> n >> m;
vector<int> nums(n+1);
int l,r;
for(int i = 1;i<=m;i++) {
cin >> l >> r;
nums[l] += -1;
nums[r] += 1;
}
int ans = 0,number = 0,t = nums[1];
for(int i = 2;i<=n;i++) {
if(t == 0) {
number++;
} else {
if(ans < number) ans = number;
number = 0;
}
t += nums[i];
//cout << t << ' ';
}
//cout << endl;
if(ans < number) ans = number;
cout << ans;
}
很明显,爆了
于是,优化了一下,维护了一个已经出现的最左的标点,当超出这个标点,就计算这两者的距离,取最大,最后特判一下结尾就好了
#include<bits/stdc++.h>
#include <vector>
#define endl '\n'
using namespace std;
using pii = pair<int,int>;
inline int max(int a,int b) { return (a>b)?a:b;}
int main() {
int n,m;cin >> n >> m;
vector<pii> nums;
int l,r;
for(int i = 0;i<m;i++) {
cin >> l >> r;
nums.emplace_back(pii(l,r));
}
sort(nums.begin(),nums.end());
/*for(int i = 0;i<m;i++) {
cout << nums[i].first << ' ';
}
cout << endl;*/
int ans = nums[0].first-1;
int left = nums[0].second;
for(int i = 1;i<m;i++) {
if(nums[i].first > left) {
ans = max(ans,nums[i].first-left-1);
}
left = max(left,nums[i].second);
}
ans = max(ans,n-left);
cout << ans;
return 0;
}

京公网安备 11010502036488号