【HDU】6012 Lotus and Horticulture (BC#91 T2)

【算法】离散化

【题解】

答案一定存在于区间的左右端点、与区间左右端点距离0.5的点上

于是把所有坐标扩大一倍,排序(即离散化)。

让某个点的前缀和表示该点的答案。

初始sum=∑c[i]

在l[i]处加上a[i]-c[i],在r[i]+1处加上b[i]-a[i]。

从左到右计算sum并比较出最大值即可。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
#include<iostream>
using namespace std;
const int inf=0x3f3f3f3f,maxn=;
struct cyc{int x,y;}a[maxn*];
long long ans,sum;
int n,A,B,C,D,E,cnt;
bool cmp(cyc a,cyc b)
{return a.x<b.x;}
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main()
{
int T=read();
while(T--)
{
int n=read();sum=,cnt=;
for(int i=;i<=n;i++)
{
A=read(),B=read(),C=read(),D=read(),E=read();A*=;B*=;
sum+=E;
a[++cnt].x=A,a[cnt].y=C-E;a[++cnt].x=B+,a[cnt].y=D-C;
}
sort(a+,a+cnt+,cmp);
ans=sum;
for(int i=,now=;i<=cnt;i++)
{
while(now<=cnt&&a[now].x==a[i].x){sum+=a[now].y;now++;}
ans=max(ans,sum);
}
printf("%lld\n",ans);
}
return ;
}
上一篇:【HDU】2191 多重背包问题


下一篇:[javase学习笔记]-6.3 对象的内存体现