注意到问题具有单调性,所以一个询问可以通过二分答案来解决。

对于多组询问,就采用整体二分来处理。

将果汁按\(d\)从大到小排序,二分出一个位置\(mid\),只考虑在位置\(mid\)之前的果汁,其中位置\(mid\)的果汁的\(d\)即为二分出的所有参与混合的果汁的美味度的最小值。

在判断一个\(mid\)合不合法时,将其之前所有果汁的体积的前缀和和各自的体积乘价格前缀和处理出来,后者就是买下所有果汁的价格。

然后对于一个询问,再进行一次二分,找到最小的价格来满足其体积的需求,然后就可以判断一个\(mid\)是否合法了。

对于前缀和的操作,可以通过树状数组来实现,随着\(mid\)的改变调整即可。

具体实现细节看代码吧。

\(code\)

#include<bits/stdc++.h>
#define maxn 200010
#define inf 1000000000000000000
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
ll n,m,now,ma;
ll ans[maxn];
struct node
{
ll d,p,l;
}t[maxn];
bool cmp(const node &a,const node &b)
{
return a.d>b.d;
}
struct query
{
ll g,l;
int id;
}q[maxn],q1[maxn],q2[maxn];
struct Tree
{
ll tr[maxn];
void update(int x,ll v)
{
while(x<=ma)
tr[x]+=v,x+=lowbit(x);
}
ll query(int x)
{
ll sum=0;
while(x)
sum+=tr[x],x-=lowbit(x);
return sum;
}
}Li,Pr;
void change(int x,int type)
{
Li.update(t[x].p,type*t[x].l),Pr.update(t[x].p,type*t[x].p*t[x].l);
}
ll find(int x)
{
int l=1,r=ma,pr=ma;
while(l<=r)
{
int mid=(l+r)>>1;
if(Li.query(mid)>=q[x].l) pr=mid,r=mid-1;
else l=mid+1;
}
return pr;
}
void solve(int L,int R,int l,int r)
{
if(L>R) return;
if(l==r)
{
for(int i=L;i<=R;++i) ans[q[i].id]=t[l].d;
return;
}
int mid=(l+r)>>1;
while(now<mid) change(++now,1);
while(now>mid) change(now--,-1);
int cnt1=0,cnt2=0;
for(int i=L;i<=R;++i)
{
ll pr=find(i),lv=Li.query(pr),pv=Pr.query(pr);
if(lv>=q[i].l&&pv-pr*(lv-q[i].l)<=q[i].g) q1[++cnt1]=q[i];
else q2[++cnt2]=q[i];
}
for(int i=1;i<=cnt1;++i) q[L+i-1]=q1[i];
for(int i=1;i<=cnt2;++i) q[L+cnt1+i-1]=q2[i];
solve(L,L+cnt1-1,l,mid),solve(L+cnt1,R,mid+1,r);
}
int main()
{
read(n),read(m);
for(int i=1;i<=n;++i)
read(t[i].d),read(t[i].p),read(t[i].l),ma=max(ma,t[i].p);
t[++n].d=-1,t[n].p=1,t[n].l=inf,sort(t+1,t+n+1,cmp);
for(int i=1;i<=m;++i) read(q[i].g),read(q[i].l),q[i].id=i;
solve(1,m,1,n);
for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
return 0;
}

题解 洛谷 P4602 【[CTSC2018]混合果汁】的更多相关文章

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

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

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

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

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

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

  4. Solution -「CTSC 2018」「洛谷 P4602」混合果汁

    \(\mathcal{Description}\)   Link.   \(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升.\(m\) ...

  5. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  6. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  7. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  8. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  9. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

随机推荐

  1. 学习oracle的SQL语句 练习

    --1.查询emp表,显示薪水大于2000,且工作类别是MANAGER的雇员信息 select * from emp where sal > 2000and job = 'MANAGER'; - ...

  2. app之功能测试

    1 什么是APP测试? App测试就是软件工程师对这类应用软件进行功能测试,性能测试,安全性测试以及兼容性测试等. 对于app测试我们一般采用的是黑盒测试方法,也会在必要的时候进行自动化测试以及性能测 ...

  3. 计算机网络之tcp三次握手

    客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西:由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客 ...

  4. python变量拷贝

    写python代码时候,如:A = 0,B = A,B = 1, 有时候会发现A变成了1,那么怎么办呢? 以下是伪代码: import copy ... X_ = copy.copy(X) ... 这 ...

  5. SpringBoot2.x的依赖管理

    前提 这篇文章是<SpringBoot2.x入门>专辑的第1篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 主要梳理一下SpringBoot2.x ...

  6. JavaScript基础尽量少使用全局变量(001)

    Pattern意思是模式,好的编码习惯经过多次实践的应用就会形成模式,而反模式(Anti-Pattern)则是不好的编码习惯.了解 JavaScript模式之前,先来看看Anti-pattern的例子 ...

  7. 接口&&多态&&构造函数&&关键字

    day06 抽象类的局限性(与接口的区别) 抽象类可以定义非抽象方法,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;jdk1.8之后接口可以包含默认方法. 一个类只能继承一个直接父类 ...

  8. 洛谷 P1991 【无线通讯网】

    这道题找到关键点那就是模板题了,代码好写哒~ 因为有S个电话,两个电话就可以连通两个块,那是不是我们就可以看做一条无消耗的边,提前连了起来.根据Kruskal的思想,我们每次加入最小的边,直到联通,由 ...

  9. 小熊派4G开发板初体验

    开发板硬件资源介绍 前阵子小熊派发布了一款超高性价比的4G开发板(19.8元包邮),但是板子仅限量1000套.小熊派官方给我送了一块,我们一起来学习学习: 板子做得小巧精致,控制核心用的是移远的EC1 ...

  10. JVM(完成度95%,不断更新)

    一.HotSpot HotSpot是最新的虚拟机,替代了JIT,提高Java的运行性能.Java原先是将源代码编译为字节码在虚拟机运行,HotSpot将常用的部分代码编译为本地代码. 对象创建过程 类 ...