Bassline
我们先来思考,怎样的
直接给出结论:
比如说
接下来考虑代码实现,为了方便,我们把上面对左端点的约束写成
因为我们想要最大化
时间复杂度
#include<bits/stdc++.h>
#define N 300050
#define int long long
using namespace std;
int f[N],x,y,v[N],mx,pre=1,sum,ans,n;
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&x,&y);
v[x-1]=1,v[y]=1;// 标记哪些位置有端点,注意左端点往左移动一个位置
f[x]++,f[y+1]--;// x 到 y 位置被覆盖的次数 +1
mx=max(mx,y);// 记录最大的坐标
}
for(int i=1;i<=mx;i++){
sum+=f[i];// 计算当前位置被多少个线段覆盖了
if(v[i])ans=max(ans,sum*(i-pre)),pre=i+1;//若这里有一个端点,则作为 y,与之前记录的 x 更新答案;然后更新 x 为此端点右边一个位置
}
printf("%lld",ans);
}