zoukankan      html  css  js  c++  java
  • codevs 3012 线段覆盖4

    传送门

    3012 线段覆盖 4

     时间限制: 1 s
     空间限制: 64000 KB
     题目等级 : 黄金 Gold
     
    题目描述 Description

    数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。

    输入描述 Input Description

    第一行一个整数n,表示有多少条线段。

    接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci。

    输出描述 Output Description

    输出能够获得的最大价值

    样例输入 Sample Input

    3

    1 2 1

    2 3 2

    1 3 4

    样例输出 Sample Output

    4

    数据范围及提示 Data Size & Hint

    n <= 1000000

    0<=ai,bi<=1000000

    0<=ci<=1000000

    数据输出建议使用long long类型(Pascal为int64或者qword类型)

    【题目大意】

    求两两不覆盖线段价值和最大。

    【思路】序列dp+二分优化+前缀和优化

    本题n的范围较大,n^2肯定T,考虑优化。

    /*原本code

    for(int i=1;i<=n;i++)
    for(int j=0;j<i;j++)
    if(s[j].y<=s[i].x)
    f[i]=max(f[i],f[j]+s[i].v)*/

    第一层循环肯定不能去。怎样去第二层呢。

    第二层的作用是找到右端点小于等于当前线段左端点线段。这个可以用二分查找,因为我们线段

    的右端点已经按照升序排列,所以对于线段i我们只需要二分出(第0条线段,第i-1条线段)这个范围内第一个小于等于

    s[i].y的线段的序号k即可。那么f[1--k]都可以被选作地推出f[i],但是我们要选最大的那个,所以我们需要对f数组来一个最大值前缀和优化。

    【code】

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct E
    {
        long long x,y,v;
    }s[1000003];
    long long mx[1000003],f[1000003],ans;
    bool cmp(E a,E b)
    {
        return a.y<b.y;
    }
    int n; 
    long long erf(int l,int r,int x)
    {
        while(l<=r)
        {
        long long mid=l+(r-l)/2;
        if(s[mid].y>x)r=mid-1;
        else l=mid+1;
        }
        return r;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%lld%lld%lld",&s[i].x,&s[i].y,&s[i].v);
        sort(s+1,s+n+1,cmp);
        for(int i=1;i<=n;i++)
        {
            f[i]=max(mx[erf(0,i-1,s[i].x)]+s[i].v,f[i]);
            ans=max(ans,f[i]);
            mx[i]=max(f[i],mx[i-1]);
        }    
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    vscode 基本知识以及如何配置 C++ 环境
    计算机视觉
    GitHub 大事件
    tf 2.0
    AI 公司与比赛
    Faster RCNN 学习与实现
    pycahrm安装说明
    python 并发之线程
    python 并发之进程
    python socketserver ftp上传功能
  • 原文地址:https://www.cnblogs.com/zzyh/p/7061533.html
Copyright © 2011-2022 走看看