线段覆盖4(codevs 3012)

题目描述 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
  还是不大懂为什么要用右端点排序
  我觉得按左端点排序能保证f值小的在前面,然后不对……
  貌似还有线段树的做法
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#define N 1000010
#define ll unsigned long long
using namespace std;
int n;ll f[N];
struct node
{
    ll a,b,v;
};node e[N];
ll read()
{
    ll num=0,flag=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)flag=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
    return num*flag;
}
bool cmp(const node&s1,const node&s2)
{
    return s1.b<s2.b;
}
int find(int x)
{
    int l=0,r=x-1,eee;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(e[mid].b<=e[x].a)
        {
            l=mid+1;
            eee=mid;
        }
        else r=mid-1;
    }
    return eee;
}
int main()
{
    freopen("jh.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      e[i].a=read(),e[i].b=read(),e[i].v=read();
    sort(e+1,e+n+1,cmp);
    ll ans=0;
    for(int i=1;i<=n;i++)
      f[i]=max(f[i-1],f[find(i)]+e[i].v),ans=max(ans,f[i]);
    cout<<ans;
    return 0;
}

时间: 2024-08-12 08:21:12

线段覆盖4(codevs 3012)的相关文章

1214 线段覆盖——http://codevs.cn/problem/1214/

第一部分:题目 题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数.有些线段之间会相互交叠或覆盖.请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点.所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分). 输入描述 Input Description 输入第一行是一个整数N.接下来有N行,每行有二

【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] Description 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝

codevs 1643 线段覆盖 3

1643 线段覆盖 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入 

codevs 1214 线段覆盖

1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数.有些线段之间会相互交叠或覆盖.请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点.所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分). 输入描

codevs 1214线段覆盖

1214 线段覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,--N.这些坐标都是区间(-999,999)的整数.有些线段之间会相互交叠或覆盖.请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点.所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分). 输入描

【codevs】【DP】3027线段覆盖2

题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大. n<=1000 输入描述 Input Description 第一行一个整数n,表示有多少条线段. 接下来n行每行三个整数, ai bi ci,分别代表第i条线段的左端点ai,右端点bi(保证左端点<右端点)和价值ci. 输出描述 Output Description 输出能够获得

【基础练习】【贪心】codevs1214 线段覆盖题解

题目:已知数轴上0<N<10000条线段.每条线段按照端点Ai和Bi(Ai<>Bi,i=1..N)定义.端点坐标在(-999,999)内,坐标为整数.有些线段可能相交.编程实现删除最少数目的线段,使得余下的任意两条线段不相交. codevs和洛谷数据范围不同 改一下常量maxn即可 思路是很简单的贪心 //codevs1214 线段覆盖 贪心 //先排序,扫描一遍,每次保留右端点最小的线段,重叠的delete,画一张图即可证明 #include<cstdio> #inc

cogs265.线段覆盖

265. 线段覆盖 ★★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比 时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操作: 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) . 把某条黑布拿走. 输入 L 和 n 次操作,要你输出每次操作之后: 条状物上有多少个黑区间. 条状物上黑区间的总长度. [输入格式] 输入文件第一行两个整数L(1<=L<=2000

COGS 265线段覆盖[线段树]

265. 线段覆盖 ★★☆   输入文件:xdfg.in   输出文件:xdfg.out   简单对比时间限制:2 s   内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操作: 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) . 把某条黑布拿走. 输入 L 和 n 次操作,要你输出每次操作之后: 条状物上有多少个黑区间. 条状物上黑区间的总长度. [输入格式] 输入文件第一行两个整数L(1<=L<=200000

CODEVS1643 线段覆盖3[贪心]

1643 线段覆盖 3  时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入