题意:给你n个区间,要你选择一个点,点每覆盖一个区间,都可以得到这个点坐标值的收益,求最大收益
题解:
离散化+差分
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define N 100010
using namespace std;
ll ans,res;
int n,cnt,k,s,q[N*4],sum[N*4],val[N*4];
struct Node {int l,r;}p[N];
int gi() {
int x=0,o=1; char ch=getchar();
while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
if(ch=='-') o=-1,ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return o*x;
}
int main() {
n=gi();
for(int i=1; i<=n; i++) {
int l=gi(),r=gi();
q[++cnt]=l,q[++cnt]=r;
p[i]=(Node){l,r};
}
sort(q+1,q+cnt+1);
k=unique(q+1,q+cnt+1)-q-1;
for(int i=1; i<=n; i++) {
int v1=p[i].l,v2=p[i].r;
p[i].l=lower_bound(q+1,q+k+1,v1)-q;
p[i].r=lower_bound(q+1,q+k+1,v2)-q;
val[p[i].l]=v1,val[p[i].r]=v2;
}
for(int i=1; i<=n; i++) {
sum[p[i].l]++,sum[p[i].r+1]--;
}
for(int i=1; i<=k; i++) {
res+=sum[i];
if(res*val[i]>ans) ans=res*val[i];
}
printf("%lld", ans);
return 0;
}