[10.2模拟] book

题意:给你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;
}
posted @ 2017-10-04 08:30  HLX_Y  阅读(111)  评论(0)    收藏  举报