[洛谷P4602] CTSC2018 混合果汁
问题描述
小 R 热衷于做黑暗料理,尤其是混合果汁。 商店里有 n 种果汁,编号为 0, 1, 2, . . . , n − 1。i 号果汁的美味度是 di,每升价格为 pi。小 R 在制作混合果汁时,还有一些特殊的规定,即在一瓶混合果汁中,i 号果汁最 多只能添加 li 升。 现在有 m 个小朋友过来找小 R 要混合果汁喝,他们都希望小 R 用商店里的果汁 制作成一瓶混合果汁。其中,第 j 个小朋友希望他得到的混合果汁总价格不大于 gj,体 积不小于 Lj。在上述这些限制条件下,小朋友们还希望混合果汁的美味度尽可能地高, 一瓶混合果汁的美味度等于所有参与混合的果汁的美味度的最小值。请你计算每个小 朋友能喝到的最美味的混合果汁的美味度。
输入格式
从文件 juice.in 中读入数据。
输入第一行包含两个正整数 n, m,表示果汁的种数和小朋友的数量。
接下来 n 行,每行三个正整数 di , pi , li,表示 i 号果汁的美味度为 di,每升价格为 pi,在一瓶果汁中的添加上限为 li。
接下来 m 行依次描述所有小朋友:每行两个数正整数 gj , Lj 描述一个小朋友,表 示他最多能支付 gj 元钱,他想要至少 Lj 升果汁。
输出格式
输出到文件 juice.out 中。
对于所有小朋友依次输出:对于每个小朋友,输出一行,包含一个整数,表示他能 喝到的最美味的混合果汁的美味度。如果无法满足他的需求,则输出 −1。
样例输入
3 4
1 3 5
2 1 3
3 2 5
6 3
5 3
10 10
20 10
样例输出
3
2
-1
1
说明
对于所有的测试数据,保证 n, m ≤ 100000,1 ≤ di , pi , li ≤ 10^5,1 ≤ gj , Lj ≤ 10^18。
解析
通过打表等一系列玄学方式可以发现答案具有单调性。二分一个d,则我们只能选择大于等于d的果汁。然后对所有大于等于d的果汁建立一棵以价格为下标的权值线段树,每个节点还要保存一下总体积和价格。这样我们就可以在权值线段树上用Lim二分了。
但是不能每二分一次就重新建树。我们可以建立一棵主席树利用可持久化来解决这个问题。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
#define N 100002
#define T 100000
using namespace std;
struct ChairmanTree{
int l,r,suml,sump;
}t[N*40];
struct juice{
int d,p,l;
}a[N];
int n,m,i,g[N],L[N],root[N],p;
int read()
{
char c=getchar();
int w=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0'){
w=w*10+c-'0';
c=getchar();
}
return w;
}
int my_comp(const juice &x,const juice &y)
{
return x.d<y.d;
}
int insert(int pre,int l,int r,int L,int P)
{
p++;
int num=p;
t[p]=t[pre];
t[p].suml+=L;t[p].sump+=L*P;
if(l<r){
int mid=(l+r)/2;
if(P<=mid) t[p].l=insert(t[pre].l,l,mid,L,P);
else t[p].r=insert(t[pre].r,mid+1,r,L,P);
}
return num;
}
int ask(int p,int l,int r,int L)
{
if(l==r) return l*L;
int mid=(l+r)/2;
if(L<=t[t[p].l].suml) return ask(t[p].l,l,mid,L);
return t[t[p].l].sump+ask(t[p].r,mid+1,r,L-t[t[p].l].suml);
}
signed main()
{
n=read();m=read();
for(i=1;i<=n;i++) a[i].d=read(),a[i].p=read(),a[i].l=read();
for(i=1;i<=m;i++) g[i]=read(),L[i]=read();
a[0].d=-1;
sort(a+1,a+n+1,my_comp);
for(i=n;i>=1;i--) root[i]=insert(root[i+1],1,T,a[i].l,a[i].p);
for(i=1;i<=m;i++){
int l=1,r=T,mid,ans=0;
while(l<=r){
mid=(l+r)/2;
if(L[i]<=t[root[mid]].suml&&ask(root[mid],1,T,L[i])<=g[i]){
ans=mid;
l=mid+1;
}
else r=mid-1;
}
printf("%lld\n",a[ans].d);
}
return 0;
}
[洛谷P4602] CTSC2018 混合果汁的更多相关文章
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
- 洛谷P4602 [CTSC2018]混合果汁(主席树)
题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 nn 种果汁,编号为 0,1,\cdots,n-10,1,⋯,n−1 . ii 号果汁的美味度是 d_idi ,每升价格为 p_ipi ...
- Solution -「CTSC 2018」「洛谷 P4602」混合果汁
\(\mathcal{Description}\) Link. \(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升.\(m\) ...
- 题解 洛谷 P4602 【[CTSC2018]混合果汁】
注意到问题具有单调性,所以一个询问可以通过二分答案来解决. 对于多组询问,就采用整体二分来处理. 将果汁按\(d\)从大到小排序,二分出一个位置\(mid\),只考虑在位置\(mid\)之前的果汁,其 ...
- Luogu P4602 [CTSC2018]混合果汁
题目 把果汁按美味度降序排序,以单价为下标插入主席树,记录每个节点的\(sum\)果汁升数和\(val\)果汁总价. 每次询问二分最小美味度,查询美味度大于等于\(mid\)的总体积为\(L\)的最低 ...
- 洛谷 P4564 [CTSC2018]假面(期望+dp)
题目传送门 题意: 有 \(n\) 个怪物,第 \(i\) 个怪物初始血量为 \(m_i\).有 \(Q\) 次操作: 0 x u v,有 \(p=\frac{u}{v}\) 的概率令 \(m_x\) ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)
Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...
- pubwin2009 备份文件恢复
local_db.DBBak 恢复注意: 1.先安装好全新server -> 用SQLManager连接数据库 连接时右键编辑 SQLSERVER注册属性 默认sql连接 帐号netcafe ...
- php调用shell的方法
一.配置 查看php.ini中配置是否打开安全模式,主要是以下三个地方safe_mode = (这个如果为off下面两个就不用管了)disable_functions = safe_mode_exe ...
- Python 输入IP地址及掩码告诉你该网段包含的全部地址(IPy模块练习)
IPy模块原本使用时需要输入正确的网络位和掩码,我利用处理报错的机制实现了输入任意IP地址和掩码均可正确输出结果的小程序. #!/usr/bin/env python # -*- coding: ut ...
- PTA(Basic Level)1029.旧键盘
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...
- 从入门到自闭之Python列表,元祖及range
1.列表 数据类型之一,存储数据,大量的,存储不同类型的数据 列表是一种有序的容器 支持索引 列表是一种可变数据类型 原地修改 列表中只要用逗号隔开的就是一个元素,字符串中只要是占一个位置的就是一个元 ...
- 使用Keras基于AdvancedEAST的场景图像文本检测
Blog:https://blog.csdn.net/linchuhai/article/details/84677249 GitHub:https://github.com/huoyijie/Adv ...
- 基础数据类型之集合和深浅copy,还有一些数据类型补充
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- leecode刷题(26)-- 用栈实现队列
leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返 ...
- mysql复习(2)
一.数据定义: SQL数据的定义包括模式的定义.表定义.视图定义和索引的定义. 1.基本的模式定义情况如下表. 2.一个关系数据库管理系统的实例中可以创建多个数据库,一个数据库中可以建立多个模式,一个 ...