题目连接:https://www.luogu.org/problemnew/show/P4602

因为题中说是让最小值最大,所以自然想到二分答案。对于每一个二分的值,判断是否合法,若合法,在右区间二分,否则在左区间二分。

那么如何判断是否合法呢?首先,对于每一个二分值mid,我们应该在[mid, n]的区间中贪心的取价格尽量低的果汁,当该小朋友所有的钱花光后,判断取到的果汁是否到了Lj升。

至于如何取,首先因为价格是无序的,所以可以建立一个大小为价格的值域的线段树,同时维护每一个区间的价格之和以及对应多少升之和(原谅我这小学水平的语文)。又因为是在动区间查询,线段树无法胜任,所以就想到了主席树(想想板子题区间第k小)。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cctype>
using namespace std;
#define enter printf("\n")
#define space printf(" ")
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + ;
const int max_size = 2e6 + ;
const int Max = 1e5;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch))
{
ans = ans * + ch - ''; ch = getchar();
}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar('' + x % );
} int n, m;
struct Juice
{
int d, p, l;
bool operator < (const Juice& other)const //按d排序
{
return d < other.d;
}
}a[maxn]; int tot = , root[max_size], lson[max_size], rson[max_size];
ll sum_co[max_size], sum_lit[max_size]; //sun_co[]:当前区间全买所花的钱,sum_lit[]当前区间有多少升
void update(int old, int& now, int L, int R, int p, int v)
{
now = ++tot;
lson[now] = lson[old]; rson[now] = rson[old];
sum_co[now] = sum_co[old] + (ll)p * v;
sum_lit[now] = sum_lit[old] + v;
if(L == R) return;
int mid = (L + R) >> ;
if(p <= mid) update(lson[old], lson[now], L, mid, p, v);
else update(rson[old], rson[now], mid + , R, p, v);
}
ll query(int old, int now, int L, int R, ll p)
{
if(L == R) return min(p / L, sum_lit[now] - sum_lit[old]); //判断当前剩的钱是否够买这种果汁的所有容量,否则只买一部分
ll sum_cost = sum_co[lson[now]] - sum_co[lson[old]]; //判断是否能买做区间的所有东西
int mid = (L + R) >> ;
if(p <= sum_cost) return query(lson[old], lson[now], L, mid, p);
else return sum_lit[lson[now]] - sum_lit[lson[old]] + query(rson[old], rson[now], mid + , R, p - sum_cost); //说明能买这些东西了,在右子区间查找
} ll GG, LL;
bool judge(int x) //钱数为下标,判断能买到的果汁有多少升
{
return query(root[x - ], root[n], , Max, GG) >= LL;
}
int solve()
{
int L = , R = n;
if(GG < LL) return -;
while(L < R)
{
int mid = (L + R + ) >> ;
if(judge(mid)) L = mid; //注意是L = mid,而不是L = mid +1,因为mid是当前合法的条件,不能舍去
else R = mid - ;
}
return !L ? - : a[L].d; //如果一直不合法,那么就会一直往做区间找,所以无法满足就是一直找到0
} int main()
{
n = read(); m = read();
for(int i = ; i <= n; ++i) {a[i].d = read(); a[i].p = read(); a[i].l = read();}
sort(a + , a + n + );
for(int i = ; i <= n; ++i) update(root[i - ], root[i], , Max, a[i].p, a[i].l);
for(int i = ; i <= m; ++i)
{
GG = read(), LL = read();
write(solve()); enter;
}
return ;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [ctsc2018] 混合果汁 【可持久化线段树】【二分答案】

    题目分析 首先考虑到最小值最大,二分答案.假设答案为k,显然这满足单调性.如果某个k使得这个情况下选不出.那么比k大的一定也选不出,所以二分答案. 接着我们可以贪心,当我们确认了k以后,一定会优先选费 ...

  10. 2019.01.14 bzoj5343: [Ctsc2018]混合果汁(整体二分+权值线段树)

    传送门 整体二分好题. 题意简述:nnn种果汁,每种有三个属性:美味度,单位体积价格,购买体积上限. 现在有mmm个询问,每次问能否混合出总体积大于某个值,总价格小于某个值的果汁,如果能,求所有方案中 ...

随机推荐

  1. js中的json的小例子

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  2. 前端面试(原生js篇) - DOM

    根据我的面试经历,一般小公司的面试环节,比较关心框架的熟练程度,以及独立开发组件的能力 但大厂通常有五轮以上的面试,而且对 js 基础语法很是看重 于是我总结了一些关于 js 基础的面试对话,有的当时 ...

  3. org.springframework.web.util.NestedServletException Handler processing failed; n

    因为谷歌的lists不支持或使用, 所有要改成java的list工具 谷歌list使用: import com.google.common.collect.Lists; .... Lists.newA ...

  4. JS 的map和array集合组合返回JSON字符串

    使用map 和array 返回自定义对象的JSON字符串: function getObjectJSON() { var array = new Array(); for (var i = 0; i ...

  5. 微信小程序获取当前地址以及选择地址详解 地点标记

    首先定义事件: bindtap='getLocation' <view class='store-bot' bindtap='getLocation'> <view class='c ...

  6. CSS中的三种常用定位

    一.相对定位(position:relative) 如果想让一个元素在本来的位置进行一个位移,可以将该元素的定位设置为relative,同时指定相对位移(利用top,bottom,left,right ...

  7. 通过PMP考试

    带了几年项目,终于持证上岗了,5A通过.

  8. Jenkins 执行python脚本

    操作很简单: * 最新版本的Jenkins,插件管理中下载两个python需要的插: * 重启Jenkins 任务中添加python脚本即可,点击保存时候,自动会在下图中目录生成.py文件 过程如下 ...

  9. python自学——列表

    #以下是我自己在联系列表中所编写的语句:names=["zangsan",'lisi','wangermazi','Xiaoliuzi','dabiaoge','牛erbiaodi ...

  10. IE8 下面通过滤镜的方式进行图片旋转

    首先,为什么我会提出这样的方式来进行操作呢?原因还是需求导致: 在做项目中,有这样一个需求,在进行网页中图片查看的时候,需要对图片的操作有支持旋转和缩放这些操作,看似这样的网上插件有很多,对!但是对于 ...