BestCoder Round #91 1002 Lotus and Horticulture

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6012

题意:

这几天Lotus对培养盆栽很感兴趣,于是她想搭建一个温室来满足她的研究欲望。
Lotus将所有的nn株盆栽都放在新建的温室里,所以所有盆栽都处于完全相同的环境中。
每一株盆栽都有一个最佳生长温度区间[l,r][l,r],在这个范围的温度下生长会生长得最好,但是不一定会提供最佳的研究价值(Lotus认为研究发育不良的盆栽也是很有研究价值的)。
Lotus进行了若干次试验,发现若第ii株盆栽的生长温度适宜,可以提供a_ia?i??的研究价值;若生长温度超过了适宜温度的上限,能提供b_ib?i??的研究价值;若生长温度低于适宜温度的下限,则能提供c_ic?i??的研究价值。
现在通过试验,Lotus已经得知了每一株盆栽的适宜生长温度范围,也知道了它们的aa、bb、cc的值。你需要根据这些信息,给温室选定一个温度(这个温度可以是任意实数),使得Lotus能获得的研究价值最大。

分析:

刚开始这么多温度,很自然的想到二分,但是,这个温度又可以是实数,不是很好处理。

其实可以发现,对于一个区间,只要处理好区间左边0.5,右边0.5,区间端点就可以概括所有情况了。

于是,由于实数温度不好处理,可以将区间*2,左边0.5,就是-1.

然后温度是很大的数据的,从最低温开始查是不合理的,于是将温度离散化。

从最低温开始,价值就是c之和。每对于一个植物的温度,端点值加a-c,右边的值减 b-a,

那么某一个温度的价值和,就是维护的数组的前缀和。

#include <bits/stdc++.h>
#define ll long long
using namespace std;

int T,n;
int L[50005],R[50005];
ll a[50005],b[50005],c[50005];
int cnt,t[300010];
ll sum[300010];

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        cnt = 0;

        memset(sum,0,sizeof(sum));

        for(int i=1; i<=n; i++) {
            scanf("%d%d%I64d%I64d%I64d",&L[i],&R[i],&a[i],&b[i],&c[i]);
            L[i] *=2;
            R[i] *=2;
        }

        for(int i=1; i<=n; i++)
        {
            t[++cnt]=L[i]-1;
            t[++cnt]=L[i];
            t[++cnt]=L[i]+1;
            t[++cnt]=R[i]-1;
            t[++cnt]=R[i];
            t[++cnt]=R[i]+1;
        }

        sort(t+1,t+cnt+1);

        cnt = unique(t+1,t+cnt+1)-t-1;  //待查的温度个数

        //温度离散化
        for(int i=1; i<=n; i++)
        {
            L[i] = lower_bound(t+1,t+cnt+1,L[i]) - t;
            R[i] = lower_bound(t+1,t+cnt+1,R[i]) - t;
        }

        for(int i=1; i<=n; i++)
        {
            sum[1] +=c[i];  //最低温
            sum[L[i]] +=a[i]-c[i];
            sum[R[i]+1] +=b[i]-a[i];
        }

        for(int i=1; i<=cnt+2; i++)
            sum[i] += sum[i-1];

        ll ans = 0;
        for(int i=1; i<=cnt+2; i++)
            ans = max(ans,sum[i]);
        cout<<ans<<endl;

    }

    return 0;
}
时间: 2024-08-12 20:52:39

BestCoder Round #91 1002 Lotus and Horticulture的相关文章

BestCoder Round #4 1002

这题真是丧心病狂,引来今天的hack狂潮~ Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 10    Accepted Submission(s): 3 Problem Description There are N point on X-axis . Miaomiao would like t

HDU BestCoder Round #1 1002 项目管理

项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可能有多条边,不过一条边的两端必然是不同的节点. 每个节点都有一个能量值. 现在我们

Manacher BestCoder Round #49 ($) 1002 Three Palindromes

题目传送门 1 /* 2 Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串 3 另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间,位运算 >>1 比 /2 速度快,用了程序跑快200ms左右,位运算大法好 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-1

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /* 2 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 3 当然有可能两个数和超过p,那么an的值最优,每次还要和an比较 4 注意:不能选取两个相同的数 5 反思:比赛时想到了%p和sort,lower_bound,但是还是没有想到这个贪心方法保证得出最大值,还是题目做的少啊:( 6 */ 7 #include <cstdio> 8 #include <algorithm>

HDU 5281 BestCoder Round #47 1002:Senior&#39;s Gun

Senior's Gun Accepts: 235 Submissions: 977 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 学姐姐是一个酷酷的枪手. 她常常会随身携带n把枪,每把枪有一个攻击力a[i]. 有一天她遇到了m只怪兽,每只怪兽有一个防御力b[j].现在她决定用手中的枪消灭这些怪兽. 学姐姐可以用第i把枪消灭第j只怪兽当且仅当b[j]≤a[i],同时她会获

矩阵快速幂---BestCoder Round#8 1002

当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [f(n-1)    f(n-2)] [ 1 1 ]     [ 1 0 ] 设A = [ 1 1 ]  [ 1 0 ] [f(n)   f(n-1)] = [f(n-2)   f(n-3)]*A*A[f(n)   f(n-1)] = [f(2)   f(1)]*A^(n-2)矩阵满足结合律,所以先计算A^

二分图判定+点染色 BestCoder Round #48 ($) 1002 wyh2000 and pupil

题目传送门 1 /* 2 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 3 每一次二分图匹配时,将点多的集合加大最后第一个集合去 4 注意:n <= 1,no,两个集合都至少有一人:ans == n,扔一个给另一个集合 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 #in

暴力+降复杂度 BestCoder Round #39 1002 Mutiple

题目传送门 1 /* 2 设一个b[]来保存每一个a[]的质因数的id,从后往前每一次更新质因数的id, 3 若没有,默认加0,nlogn复杂度: 4 我用暴力竟然水过去了:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <cstring> 9 #include <string> 10 #include <algorithm> 11 using namespace std;

BestCoder Round #1 1002 项目管理 (HDU 4858)

项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 738    Accepted Submission(s): 260 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值. 现在我