题意

一个容量为ccc升的浇水机器,一开始有c0c0c0升水,它每分钟会消耗111升水

有nnn个人,第iii个人会在第tit_iti​分钟至多带aia_iai​升水过来并把他带的水一次性倒进机器,每升水卖bib_ibi​元

问要使得抽水机撑到第mmm分钟不断水(即剩余水量恒≥0\ge0≥0),最少的花费是多少;如果撑不到,输出−1-1−1

0≤n≤5×105,2≤m≤109,1≤c0≤c≤1090\le n\le5\times10^5,2\le m\le10^9,1\le c0\le c\le10^90≤n≤5×105,2≤m≤109,1≤c0≤c≤109


题解

考虑贪心

先把所有人按照按照时间排序

对于第iii个人,Δti=ti−ti−1\Delta t_i=t_i-t_{i-1}Δti​=ti​−ti−1​,我们可以把机器里剩余的水按价格从低到高地用掉,并记录答案

对于每一个人我们把他带的水全部倒进去,直到满了为止,但是先不计费

如果机器里最贵的水价格>bi\gt b_i>bi​,那么我们就可以把最贵的水倒出去一些,再把第iii个人的水再倒进去一些(如果还有的话),就相当于那个人来的时候少带了一些水,而且这样也不会影响机器撑到tit_iti​

可以发现这样的花费一定是最小的

具体实现可以设map<int,int>qmap<int,int>qmap<int,int>q,其中q[a]q[a]q[a]表示机器中剩余的价格为aaa的水有多少升

用水的时候每次取出最便宜的水(即q.begin().secondq.begin().secondq.begin().second)来更新答案,用完后就删除

加水的时候取出最贵的水(即q.rbegin().firstq.rbegin().firstq.rbegin().first)和当前的bib_ibi​比较,并计算要替换掉多少,完全替换了就删除

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)

#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=fi[u],v=e[i].to;i;v=e[i=e[i].nx].to)
#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char ss[1<<17],*A=ss,*B=ss;
inline char gc(){return A==B&&(B=(A=ss)+fread(ss,1,1<<17,stdin),A==B)?-1:*A++;}
template<class T>inline void sd(T&x){char c;T y=1;while(c=gc(),(c<48||57<c)&&c!=-1)if(c==45)y=-1;x=c-48;while(c=gc(),47<c&&c<58)x=x*10+c-48;x*=y;
}
const int N=5e5+5,M=N<<1;
typedef int arr[N];
typedef long long ll;
struct Water{int t,a,b;inline void in(){sd(t),sd(a),sd(b);}bool operator<(const Water&y)const{return t==y.t?(a==y.a?b<y.b:a<y.a):t<y.t;}
}a[N];
int n,m,c,res;map<int,int>q;
inline ll sol(){ll ans=0;sd(n),sd(m),sd(c),sd(res);fp(i,1,n)a[i].in();a[++n]=(Water){m,0,0};sort(a+1,a+n+1);q.clear();q[0]=res;fp(i,1,n){int DeltaT=a[i].t-a[i-1].t;if(DeltaT>c)return -1;while(!q.empty()&&DeltaT>0){int W=min(DeltaT,q.begin()->second);ans+=(ll)q.begin()->first*W;q.begin()->second-=W;DeltaT-=W;res-=W;if(!q.begin()->second)q.erase(q.begin());}if(DeltaT)return -1;int Cnt=a[i].a,Cost=a[i].b,add=min(c-res,Cnt);res+=add;while(!q.empty()&&add<Cnt&&Cost<q.rbegin()->first)if(Cnt-add>=q.rbegin()->second){add+=q.rbegin()->second;q.erase(--q.end());}else{q.rbegin()->second-=Cnt-add;add=Cnt;}q[Cost]+=add;}return ans;}
int main(){#ifndef ONLINE_JUDGEfile("s");#endifint q;sd(q);while(q--)printf("%lld\n",sol());
return 0;
}

[Codeforces1238G]Adilbek and the Watering System相关推荐

  1. Educational Codeforces Round 74 (Rated for Div. 2)

    Educational Codeforces Round 74 (Rated for Div. 2) 原题地址 # 题目 分数 是否AC A Prime Subtraction 900 ✅ B Kil ...

  2. 基于单片机的自动追日系统设计_基于单片机的自动浇花系统的设计

    龙源期刊网 http://www.qikan.com.cn 基于单片机的自动浇花系统的设计 作者:吴蓓 张阳 来源:<现代信息科技> 2018 年第 03 期 摘 要:为了解决人们生活中由 ...

  3. 生成长微博(文转图)方法

    #region 长微博生成图片处理合心方法public string ConvertTextFileToImage(String text, String imageFile){System.Draw ...

  4. diy 单片机 自动浇花_基于单片机的自动浇花系统的设计

    中图分类号:TP368.12文献标识码:A 文章编号:2096-4706(2018)03-0000-03 Design of Automatic Watering System Basedon Sin ...

  5. c语言单片机自动浇花系统,基于51系列单片机的盆花自动浇水系统设计.doc

    摘要:随着科学技术的发展,尤其是单片机技术和半导体技术的高速发展,利用单片机控制仪器的研究及应用越来越受到重视.目前,盆栽植物越来越受到城市居民的喜爱,但是往往存在着人工给盆栽植物浇水带来的局限性,为 ...

  6. BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )

    MST...一开始没注意-1结果就WA了... ---------------------------------------------------------------------------- ...

  7. dhl:类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义必须添加对程序集“System.Data.Entity引用...

    必须添加对程序集"System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089& ...

  8. SoC(System on chip)与NoC(network-on-chip)

    SoC(System on chip)与NoC(network-on-chip) NoC是相对于SoC的新一代片上互连技术,要深入了解NoC必须深刻认识SoC,故本文组织结构为:  SoC架构  ...

  9. 如何使用Nsight System?

    如何使用Nsight System?

最新文章

  1. WCF配置文件全攻略
  2. sqlaction 更新至 v0.2.1.0,自动生成 JDBC 代码的数据库持久层工具
  3. 一名运营,自学一年前端,成功入职杭州某独角兽企业,他的面试经验和学习方法等分享...
  4. node 安装 webpack
  5. js原型链。。fuck
  6. 中国量子计算机领先美国吗,好消息!中国又一项技术领先全球,美国院士:这是划时代的成果...
  7. mysql筛选向导后返回原表_Navcat关于导出向导的常见问题!
  8. 一起谈.NET技术,asp.net控件开发基础(17)
  9. python的多行语句可以使用反斜杠_Python的续行符:反斜杠\
  10. 数据挖掘技术有哪几种
  11. 计算机组成原理课程设计报告总结
  12. java万年历代码_JAVA实现的简单万年历代码
  13. 关于广告系统的定向,看这篇就够了
  14. java微信支付详解_java微信支付接入流程详解
  15. php中划弧线,cad画弧形的快捷键是什么?如何画弧形?
  16. 看看同一种字体是如何对应不同的字体文件的
  17. gson 解析int类型转换为double解决方案
  18. 人工智能的发展趋势分析
  19. excel综合应用(一):信息查询
  20. 网络协议分析(第二版)期末复习资料一

热门文章

  1. 【C语言小游戏】计算器
  2. 摩托车/电动车/汽车等加装射灯控制电路
  3. openstack-iass搭建 二
  4. 嵌入式新闻早班车-第5期
  5. 5V升压充电8.4V芯片
  6. 使用STM32f103点亮led灯——库函数版本
  7. 【5G系列】MICO学习总结(2)
  8. 最有效的一种技术领导是“以身作则”
  9. openflow初学者入门笔记一(openflow 1.0 and openflow 1.3)
  10. 设计模式 - 创建型设计模式小结