HDU 6012 Lotus and Horticulture

本文介绍了一种解决特定温度区间问题的算法实现。通过使用排序、二分查找及前缀和的方法来高效处理区间内温度变化的问题。文章详细展示了如何处理闭区间内的实数温度值,并给出完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Solution

讨论版误导我好久
[li,ri]确实是闭区间,但是温度是可以取实数的,比如
1 2 100 300 200
2 3 300 100 200
ans=600 取2.5
所以我们保存坐标的时候需要保存li与ri+0.5

剩下的事情,就是排序+二分+前缀和的运用了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define db double
using namespace std;
int n,v,cas,tot;
int a[50005],b[50005],c[50005];
double t[100005];
ll now,ans,s;
struct ty
{
    db d;
    int id;
    ll sa,sb,sc;
}L[50005],R[50005];
bool cmp1(ty x,ty y)
{
    return x.d>y.d;
}
bool cmp2(ty x,ty y)
{
    return x.d<y.d;
}
int erfen1(int l,int r,db x)
{
    if(l>r) return r;
    int mid=(l+r)/2;
    if(x>=L[mid].d) return erfen1(l,mid-1,x); else return erfen1(mid+1,r,x);
}
int erfen2(int l,int r,db x)
{
    if(l>r) return r;
    int mid=(l+r)/2;
    if(x>R[mid].d) return erfen2(mid+1,r,x); else return erfen2(l,mid-1,x);
}
int main()
{
    cin>>cas;
    while(cas--) 
    {
        cin>>n;
        tot=0;ans=0;s=0;
        for(int i=1;i<=n;i++) 
        {
            scanf("%lf%lf%d%d%d",&L[i].d,&R[i].d,&a[i],&b[i],&c[i]);
            L[i].id=i;
            R[i].id=i;
            tot++;
            t[tot]=L[i].d;
            tot++;
            t[tot]=R[i].d+0.5;
            s=s+a[i];
        }
        sort(t+1,t+tot+1);
         sort(L+1,L+n+1,cmp1);
        sort(R+1,R+n+1,cmp2);
        for(int i=1;i<=n;i++) 
        { 
            v=L[i].id;
            L[i].sa=L[i-1].sa+a[v];
            L[i].sb=L[i-1].sb+b[v];
            L[i].sc=L[i-1].sc+c[v];
            v=R[i].id;
            R[i].sa=R[i-1].sa+a[v];
            R[i].sb=R[i-1].sb+b[v];
            R[i].sc=R[i-1].sc+c[v];
        }
        for(int i=1;i<=tot;i++) 
        {
            v=erfen1(1,n,t[i]);
            now=s-L[v].sa+L[v].sc;
            v=erfen2(1,n,t[i]);
            now=now-R[v].sa+R[v].sb;
            ans=max(ans,now);
        }
        ans=max(ans,L[n].sc);
        printf("%I64d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值