P4602 [CTSC2018] 混合果汁
贪心思想,整体二分+权值线段树解决。
\(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] 混合果汁的更多相关文章
- 洛谷P4602 [CTSC2018]混合果汁(主席树)
题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 nn 种果汁,编号为 0,1,\cdots,n-10,1,⋯,n−1 . ii 号果汁的美味度是 d_idi ,每升价格为 p_ipi ...
- [洛谷P4602] CTSC2018 混合果汁
问题描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 n 种果汁,编号为 0, 1, 2, . . . , n − 1.i 号果汁的美味度是 di,每升价格为 pi.小 R 在制作混合果汁时 ...
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
- Luogu P4602 [CTSC2018]混合果汁
题目 把果汁按美味度降序排序,以单价为下标插入主席树,记录每个节点的\(sum\)果汁升数和\(val\)果汁总价. 每次询问二分最小美味度,查询美味度大于等于\(mid\)的总体积为\(L\)的最低 ...
- BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...
- [Bzoj]5343: [Ctsc2018]混合果汁
5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...
- BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树
BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...
- 题解 洛谷 P4602 【[CTSC2018]混合果汁】
注意到问题具有单调性,所以一个询问可以通过二分答案来解决. 对于多组询问,就采用整体二分来处理. 将果汁按\(d\)从大到小排序,二分出一个位置\(mid\),只考虑在位置\(mid\)之前的果汁,其 ...
- BZOJ5343 & 洛谷4602 & LOJ2555:[CTSC2018]混合果汁——题解
https://www.luogu.org/problemnew/show/P4602 https://loj.ac/problem/2555 https://www.lydsy.com/JudgeO ...
- [bzoj5343][Ctsc2018]混合果汁_二分答案_主席树
混合果汁 bzoj-5343 Ctsc-2018 题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升.现在要求用这$n$中果汁调配出$m$杯 ...
随机推荐
- Qt QSqlDatabase的removeDatabase需要注意的地方
文章目录 问题描述 Qt官方解决方法 另外一种解决方式 碎碎念 关于智能指针 问题描述 今天在做之前代码的重构的时候,在调用QSqlDatabase的removeDatabase函数的时候,出现了如下 ...
- linux ubuntu mysql 默认密码
前言 linux ubuntu安装mysql Ubuntu 安装 MySQL 后,在 /etc/mysql 目录下有个 debian.cnf,这里存储着默认的密码. [client] host = l ...
- golang定时器函数 每隔几分钟执行一个函数
延时调用 AfterFunc go function() func function() { // TODO 具体逻辑 // 每5分钟执行一次,递归调用自己 time.AfterFunc(5*time ...
- PHP的回调函数
所谓的回调函数,就是指调用函数时并不是向函数中传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中,这个作为参数的函数就是回调函数.通俗的来说,回调函数也是一个我们定义的函数,但是不 ...
- 使用Python可视化洛伦兹变换
引言 大家好!今天我们将探讨一个非常有趣且重要的物理概念-洛伦兹变换.它是相对论的核心内容之一,描述了在高速运动下,时间.长度以及其他物理量是如何发生变化的.通过使用 Python 进行可视化,我们不 ...
- Javascript+webdriverio实现app自动化demo
1.新建工程和安装库 使用WebStorm新建一个空项目然后在编辑器打开终端输入如下命令: npm init -y npm install webdriverio npm install sleep ...
- Spring的基础结构和核心接口
目录 1.BeanDefinition 2.BeanDefinitionReader 3.BeanDefinitionRegistry 4.BeanFactory 5.ApplicationConte ...
- SynchronousQueue底层实现原理剖
一.SynchronousQueue底层实现原理剖 SynchronousQueue(同步移交队列),队列长度为0.作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据.同样,从队列 ...
- 单元测试——Mock RestTemplate
service代码如下: public class TestServiceImpl implements ITestService { @Autowired RestTemplate restTemp ...
- MySQL 参考资料
官方文档:https://dev.mysql.com/doc/refman/5.7/en/ 书: 1.<高性能MySQL> 2.<MySQL是怎样运行的:从根儿上理解MySQL> ...