一.题目链接:
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;
}