一.题目链接:

HDU-6012

二.题目大意:

T 组样例.

一个整数 n ,代表植物个数.  n∈[1,50000]

每个植物都有一段最适温度范围[l, r](保证输入为整数)

对于每株植物 i

若当前温度 ∈ ,则该植物生产  点价值.

若当前温度 < ,则该植物生产  点价值.

若当前温度 > ,则该植物生产  点价值.

 ∈ [1,1e9].

注意:温度为任意实数.

问最大收益值为多少.

三.分析:

既然温度为任意实数,意思就是说当两植株的温度边界分别为 1 和 2 时,最适温度可能取 1.5.

那么这里用离散化处理一下,将所有的温度 × 2,便省去了精度控制.

再看  ∈ [1,109].

要是一一枚举的话铁定超时.

观察到 n 的范围可以接受,那就枚举n,即枚举植株 i 的边界.

首先假设初始温度小于所给温度的最小值,此时   

然后枚举每个植株的温度边界,得到答案后记录最大值即可.

详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-4
#define PI acos(-1.0)
#define ll long long int
using namespace std;

const int M = 50010;
struct node
{
    ll boder;
    ll value;
}s[M * 2];

bool cmp(node a, node b)
{
    return a.boder < b.boder;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        ll ans = 0;
        for(int i = 0; i < n; ++i)
        {
            ll l, r, a, b, c;
            scanf("%lld %lld %lld %lld %lld", &l, &r, &a, &b, &c);
            s[i * 2].boder = l * 2;
            s[i * 2].value = a - c;
            s[i * 2 + 1].boder = r * 2 + 1;
            s[i * 2 + 1].value = b - a;
            ans += c;
        }
        n *= 2;
        sort(s, s + n, cmp);
        ll sum = ans;
        for(int i = 0; i < n; )
        {
            ll tmp = s[i].boder;
            while(s[i].boder == tmp)
            {
                sum += s[i].value;
                ++i;
            }
            ans = max(ans, sum);
        }
        printf("%lld\n", ans);
    }
    return 0;
}