zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    2018CodeM复赛
    poj3683
    bzoj3991
    bzoj2809
    bzoj1001
    bzoj1412
    计蒜之道2018复赛
    HDU2255
    bzoj1010
    bzoj2006
  • 原文地址:https://www.cnblogs.com/HLXZZ/p/7625186.html
Copyright © 2011-2022 走看看