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

\(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. 查看、安装python指定版本的包、安装卸载第三方模块

    python安装/卸载第三方包 (1)安装第三方包: 安装指令pip install xxx (xxx,需安装的包名) 安装特定版本的package:通过使用==, >=, <=, > ...

  2. Sql 字符串截取

    注意 不同数据库内置函数名称或有差异,可参考 1.从左至右截取 ①使用left()函数可以从左至右对字符串进行截取 语法:LEFT(str,length) str是要进行截取的字符串,length是要 ...

  3. 如何避免VMware平台ESXi主机CPU使用率的“坑”?

    https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=2650636818&idx=1&sn=c43f3a3146092f ...

  4. BUUCTF---Cipher1(playfair)

    playfair Playfair密码原理以及该题解题步骤 Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Char ...

  5. DVWA靶场实战(十三)——CSP Bypass

    DVWA靶场实战(十三) 十三.CSP Bypass: 1.漏洞原理: CSP Bypass全称是Content-Security-Policy,中文叫做绕过内容安全策略.Content-Securi ...

  6. 内部类--匿名内部类--java进阶day03

    1.匿名内部类 在介绍匿名内部类前,先引用一段代码材料,通过这段代码来理解匿名内部类 如下图,我们定义了接口和一个方法,方法中调用该接口的抽象方法,这时我们要调用use方法,但是该怎么传参呢? 我们将 ...

  7. String类的三种常见构造方法

    1.根据构造方法创建字符串对象 1.public String() 创建一个空字符串,里面不包含任何内容 2.public String(char[] chs) 创建一个字符数组,将其拼接成字符串对象 ...

  8. 探秘Transformer系列之(20)--- KV Cache

    探秘Transformer系列之(20)--- KV Cache 目录 探秘Transformer系列之(20)--- KV Cache 0x00 概述 0x01 自回归推理的问题 1.1 请求的生命 ...

  9. leetcode每日一题:图中的最长环

    题目 2360. 图中的最长环 给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边. 图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 ...

  10. FREERTOS_LWIP TcpServer 加快接收速度

    刚开始调试时,关注点都在接收缓存等参数上,接受的间隔上限时钟在250ms左右. 后来发现是其中一个参数的设定决定了接收的速度,调整参数后,可以达到每80ms接收1024个字节. 发文留存,备忘.