贪心思想,整体二分+权值线段树解决。

\(Step\ 1\) 首先将所有果汁的美味度按从大到小排序,若美味度高的果汁可以满足小朋友的两个需求,则储存答案。

\(Step\ 2\) 不断二分果汁,并且枚举小朋友,若当前果汁能满足小朋友的两个要求,则将小朋友分流到左区间,否则则分流到右区间。其中左区间会提高果汁的美味度,右区间会减少。

\(Step\ 3\) 分流小朋友致叶子节点后,将这个区间的小朋友给予当前美味度的果汁,理由同 \(Step\ 1\)。

现在考虑如何维护小朋友的两个需求,以果汁的价格为权值构造权值线段树,维护当前左区间内的果汁价格,并与小朋友的消费能力比较,筛选出小朋友。

记得开 long long

#include <bits/stdc++.h>
using namespace std;
long long read(){
long long x=0;
int f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){ if(ch=='-') f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
inline void put(int x){
if(x<0){putchar('-');x=-x;}
if(x>=10) put(x/10);
putchar(x%10+'0');
}
#define p2 p<<1
#define p3 p<<1|1
const int N=1e5+7;
int n,m;
struct Juice{
int d,p,l;
bool operator <(Juice x) {
return d>x.d;
}
}a[N];
struct kids{
long long g,l;
int id;
}q[N],q1[N],q2[N];
long long vol[N<<2],mon[N<<2];
int idx;
int ans[N];
void pushup(int p){
vol[p]=vol[p2]+vol[p3];
mon[p]=mon[p2]+mon[p3];
}
void add(int p,int l,int r,int Jp,int Jl){
if(l==r){
vol[p]+=Jl;
mon[p]=vol[p]*l;
return;
}
int mid=(l+r)>>1;
if(Jp<=mid) add(p2,l,mid,Jp,Jl);
else add(p3,mid+1,r,Jp,Jl);
pushup(p);
}
long long query(int p,int l,int r,long long v){
if(!v) return 0;
if(l==r) return l*v;//价格的零头
int mid=(l+r)>>1;
if(vol[p2]>=v) return query(p2,l,mid,v);
else return mon[p2]+query(p3,mid+1,r,v-vol[p2]);
}
void Work(int l,int r,int L,int R){
if(l>r) return;
if(L==R){//当前区间的小朋友可以适配果汁 L。
for(int i=l;i<=r;i++) ans[q[i].id]=a[L].d;
return;
}
int mid=(L+R)>>1,p0=0,p1=0;
while(idx<mid) idx++,add(1,1,N,a[idx].p,a[idx].l);//维护当前左区间内的果汁价格
while(idx>mid) add(1,1,N,a[idx].p,-a[idx].l),idx--;
for(int i=l;i<=r;i++){//筛选出适配的小朋友
if(vol[1]>=q[i].l&&query(1,1,N,q[i].l)<=q[i].g) q1[++p0]=q[i];
else q2[++p1]=q[i];
}
for(int i=1;i<=p0;i++) q[l+i-1]=q1[i];
for(int i=1;i<=p1;i++) q[l+p0+i-1]=q2[i];
Work(l,l+p0-1,L,mid);
Work(l+p0,r,mid+1,R);
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
n=read(),m=read();
for(int i=1;i<=n;i++) {
a[i].d=read(),a[i].p=read(),a[i].l=read();
}
a[++n]={-1,0,N};//无解的小朋友会被分流到这里
sort(a+1,a+1+n);//贪心,排序
for(int i=1;i<=m;i++){
q[i].g=read(),q[i].l=read();
q[i].id=i;
}
Work(1,m,1,n);
for(int i=1;i<=m;i++) put(ans[i]),putchar('\n');
return 0;
}

P4602 [CTSC2018] 混合果汁的更多相关文章

  1. 洛谷P4602 [CTSC2018]混合果汁(主席树)

    题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 nn 种果汁,编号为 0,1,\cdots,n-10,1,⋯,n−1 . ii 号果汁的美味度是 d_idi​ ,每升价格为 p_ipi ...

  2. [洛谷P4602] CTSC2018 混合果汁

    问题描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 n 种果汁,编号为 0, 1, 2, . . . , n − 1.i 号果汁的美味度是 di,每升价格为 pi.小 R 在制作混合果汁时 ...

  3. LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)

    LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...

  4. Luogu P4602 [CTSC2018]混合果汁

    题目 把果汁按美味度降序排序,以单价为下标插入主席树,记录每个节点的\(sum\)果汁升数和\(val\)果汁总价. 每次询问二分最小美味度,查询美味度大于等于\(mid\)的总体积为\(L\)的最低 ...

  5. BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案

    题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...

  6. [Bzoj]5343: [Ctsc2018]混合果汁

    5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...

  7. BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树

    BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...

  8. 题解 洛谷 P4602 【[CTSC2018]混合果汁】

    注意到问题具有单调性,所以一个询问可以通过二分答案来解决. 对于多组询问,就采用整体二分来处理. 将果汁按\(d\)从大到小排序,二分出一个位置\(mid\),只考虑在位置\(mid\)之前的果汁,其 ...

  9. BZOJ5343 & 洛谷4602 & LOJ2555:[CTSC2018]混合果汁——题解

    https://www.luogu.org/problemnew/show/P4602 https://loj.ac/problem/2555 https://www.lydsy.com/JudgeO ...

  10. [bzoj5343][Ctsc2018]混合果汁_二分答案_主席树

    混合果汁 bzoj-5343 Ctsc-2018 题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升.现在要求用这$n$中果汁调配出$m$杯 ...

随机推荐

  1. Web前端入门第 11 问:HTML 常用标签有多少?全量标签有多少?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 截止发文,MDN 收录的 HTML 全量标签有 126 个,有 18 个标记已弃用. 名词解释:MDN --- ...

  2. mysql -- 自定义函数及循环结构

    和存储过程类似,区别在于存储过程可以有0个或多个返回,但是函数只能有唯一一个返回值 一般而言,存储过程适合批量插入,批量删除,增删改:函数则用于处理数据,查询某个值. 创建 create functi ...

  3. [源码系列:手写spring] IOC第九节:应用上下文ApplicationContext

    内容介绍 在Spring中应用上下文ApplicationContext是相较于BeanFacotry更为先进的IOC容器,BeanFacotry是Spring实现IOC最基础最核心的接口,使得Spr ...

  4. 🎀chrome-截图录屏插件-Awesome Screenshot

    简介 Awesome Screenshot 截图录屏是一款浏览器扩展程序,它可以帮助用户进行网页截图.编辑图片以及录制屏幕视频 版本 4.4.22 功能 截图:可以截取整个网页(即使是需要滚动才能看到 ...

  5. 解决MySQL数据库中1045错误[1045 Access denied for user 'root'@'localhost' (using password:YES)]

    数据库连接异常 1045 Access denied for user 'root'@'localhost' (using password:YES) 这种问题的本质是用户密码出现错误 解决方案 1. ...

  6. 聊聊@Autowired与@Resource的区别

    1. 前言 从事过很多家公司,见过很多项目,发现@Autowired和@Resource的使用都是一样的乱, 一个项目中有使用@Autowired的,有使用@Resource的, 甚至有的类中一会儿使 ...

  7. packer 学习笔记

    前言 网上有一个老哥用 packer 制作镜像的博客里开篇就提到[1]. Failure is success in progress. -- Albert Einstein 不要害怕失败,在用 pa ...

  8. 【经验】Git|如何删除错误的commit?(存在大文件无法push的commit、不需要的commit等情况、清除所有commit的情况)

    2024/04/24说明:这篇暂时修改为粉丝可见,因为正在冲粉丝量,等到我弄完了粉丝量的要求,我就改回来!不方便看到全文的小伙伴不好意思!! 文章目录 情况一:尚未推送或无法推送 情况二:已经推送 情 ...

  9. Python 3.14 新特性盘点,更新了些什么?

    Python 3.14.0 稳定版将于 2025 年 10 月正式发布,目前已进入 beta 测试阶段.这意味着在往后的几个月里,3.14 的新功能已冻结,不再合入新功能(除了修复问题和完善文档). ...

  10. LR_GD_MSE (公式补充)

    上篇是先撸了一把梯度下降的代码, 用来优先 LR 中的 MSE. 核心代码是在求解梯度这一步. # y = wx + b def step_gradient(b_current, w_current, ...