传送门http://acm.hdu.edu.cn/showproblem.php?pid=6012
Solution
很经典的问题,把所有的变化点按温度排序后扫一次
比赛时追求速度,写得很丑
#include<stdio.h>
#include<algorithm>
#define N 50005
using namespace std;
typedef long long ll;
int l[N],r[N],a[N],b[N],c[N];
struct node
{
double v;
int c;
friend bool operator <(node a,node b)
{
return a.v<b.v;
}
}tmp[N*2];
int main()
{
int T,n;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
ll st=0;
for (int i=1;i<=n;i++) scanf("%d%d%d%d%d",l+i,r+i,b+i,c+i,a+i),st+=a[i];
for (int i=1;i<=n;i++)
{
tmp[i].v=l[i],tmp[i].c=b[i]-a[i];
tmp[i+n].v=r[i]+0.5,tmp[i+n].c=c[i]-b[i];
}
sort(tmp+1,tmp+n*2+1);
ll ans=st;
for (int i=1;i<=n*2;i++)
{
st+=tmp[i].c;
while (tmp[i+1].v==tmp[i].v && i<n*2) st+=tmp[++i].c;
ans=max(ans,st);
}
printf("%I64d\n",ans);
}
}