问题描述
这几天Lotus对培养盆栽很感兴趣,于是她想搭建一个温室来满足她的研究欲望。 Lotus将所有的nnn株盆栽都放在新建的温室里,所以所有盆栽都处于完全相同的环境中。 每一株盆栽都有一个最佳生长温度区间[l,r][l,r][l,r],在这个范围的温度下生长会生长得最好,但是不一定会提供最佳的研究价值(Lotus认为研究发育不良的盆栽也是很有研究价值的)。 Lotus进行了若干次试验,发现若第iii株盆栽的生长温度适宜,可以提供aia_iai的研究价值;若生长温度超过了适宜温度的上限,能提供bib_ibi的研究价值;若生长温度低于适宜温度的下限,则能提供cic_ici的研究价值。 现在通过试验,Lotus已经得知了每一株盆栽的适宜生长温度范围,也知道了它们的aaa、bbb、ccc的值。你需要根据这些信息,给温室选定一个温度(这个温度可以是任意实数),使得Lotus能获得的研究价值最大。
输入描述
多组数据,第一行一个整数TTT表示数据组数 每组数据第一行一个整数n∈[1,50000]n\in[1,50000]n∈[1,50000],表示盆栽数量 接下来nnn行每行五个整数li,ri,ai,bi,ci∈[1,109]l_i,r_i,a_i,b_i,c_i\in[1, 10^9]li,ri,ai,bi,ci∈[1,109],意义如上所述
输出描述
每组数据输出一行一个整数表示答案
输入样例
1 5 5 8 16 20 12 10 16 3 13 13 8 11 13 1 11 7 9 6 17 5 2 11 20 8 5
输出样例
83
解题思路: 由于区间是左闭右闭的,所以【L,R】 ,R点离散化比较难处理,因为要在R+0.5处,所以将坐标扩大2倍就行了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int N = 5e5 + 100;
struct node
{
ll num;
int t;
}f[N];
bool cmp(node t1,node t2)
{
return t1.t<t2.t;
}
int main()
{
int T,i,j,n,k,ii;
int l,r,a,b,c;
ll ans,tmp;
scanf("%d",&T);
while(T--) {
ans=tmp=0;
k=0;
scanf("%d",&n);
for(i=1;i<=n;i++) {
scanf("%d%d%d%d%d",&l,&r,&b,&c,&a);
f[k].num=1LL*(-a+b),f[k++].t=l*2;
f[k].num=1LL*(-b+c),f[k++].t=r*2+1;
tmp=(ll)(tmp+a);
}
ans=tmp;
sort(f,f+k,cmp);
for(i=0;i<k;i++) {
j=i;
while(j+1<k && f[j+1].t==f[j].t) j++;
for(ii=i;ii<=j;ii++) {
tmp+=f[ii].num;
}
ans=max(ans,tmp);
i=j;
}
printf("%I64d\n",ans);
}
return 0;
}