Solution -「CTSC 2018」「洛谷 P4602」混合果汁
\(\mathcal{Description}\)
Link.
\(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升。\(m\) 组询问,给定花费上限 \(g\) 和果汁需求量 \(L\),求混合多种果汁以满足要求时,所用果汁最小美味度的最大值。
\(n,m,p_i\le10^5\)。
\(\mathcal{Solution}\)
最小值最大,显然二分。
需要 check:能否用美味度不小于 \(mid\) 的果汁混合出 \(L\) 升,使得价格不超过 \(g\)。
没有美味度的限制,贪心地用单价更低的果汁就好啦!
回归到原问题,以按美味度降序排列后的果汁编号为版本轴建主席树,树是以单价为下标的权值线段树。外层二分出 \(mid\),再在以 \(mid\) 为根的树上走,贪心地购买果汁(先买左子树,不够再去右子树)。
就完了 qwq。复杂度 \(\mathcal O(n\log^2n)\)。
\(\mathcal{Code}\)
#include <cstdio>
#include <algorithm>
const int MAXN = 1e5;
int n, m, root[MAXN + 5];
typedef long long LL;
inline LL rint () {
LL x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
struct Juice {
int d, p, l;
inline void read () { d = rint (), p = rint (), l = rint (); }
inline bool operator < ( const Juice t ) const { return d > t.d; }
} juice[MAXN + 5];
struct PersistentSegmentTree {
static const int MAXND = MAXN * 40;
int cntnd, ch[MAXND + 5][2];
LL sum[MAXND + 5], prc[MAXND + 5];
inline void build ( int& rt, const int l, const int r ) {
rt = ++ cntnd;
if ( l == r ) return ;
int mid = l + r >> 1;
build ( ch[rt][0], l, mid ), build ( ch[rt][1], mid + 1, r );
}
inline void pushup ( const int rt ) {
sum[rt] = sum[ch[rt][0]] + sum[ch[rt][1]];
prc[rt] = prc[ch[rt][0]] + prc[ch[rt][1]];
}
inline void insert ( int& rt, const int l, const int r, const int p, const int v ) {
int old = rt, mid = l + r >> 1; rt = ++ cntnd;
ch[rt][0] = ch[old][0], ch[rt][1] = ch[old][1], sum[rt] = sum[old], prc[rt] = prc[old];
if ( l == r ) return sum[rt] += v, prc[rt] += 1ll * v * p, void ();
if ( p <= mid ) insert ( ch[rt][0], l, mid, p, v );
else insert ( ch[rt][1], mid + 1, r, p, v );
pushup ( rt );
}
inline LL buy ( const int rt, const int l, const int r, LL money, LL need ) {
if ( sum[rt] < need || money < 0 ) return -1;
if ( l == r ) return need * l <= money ? need * l : -1;
int mid = l + r >> 1;
if ( sum[ch[rt][0]] >= need ) return buy ( ch[rt][0], l, mid, money, need );
else {
LL t = buy ( ch[rt][1], mid + 1, r, money - prc[ch[rt][0]], need - sum[ch[rt][0]] );
return ~ t ? t + prc[ch[rt][0]] : -1;
}
}
} pst;
int main () {
n = rint (), m = rint ();
int mxp = 0;
for ( int i = 1; i <= n; ++ i ) {
juice[i].read ();
if ( mxp < juice[i].p ) mxp = juice[i].p;
}
std::sort ( juice + 1, juice + n + 1 );
pst.build ( root[0], 1, mxp );
for ( int i = 1; i <= n; ++ i ) {
pst.insert ( root[i] = root[i - 1], 1, mxp, juice[i].p, juice[i].l );
}
for ( LL g, L; m --; ) {
g = rint (), L = rint ();
int l = 1, r = n;
LL ans = -1, tmp;
while ( l <= r ) {
int mid = l + r >> 1;
if ( ~ pst.buy ( root[mid], 1, mxp, g, L ) ) r = ( ans = mid ) - 1;
else l = mid + 1;
}
printf ( "%d\n", ~ ans ? juice[ans].d : -1 );
}
return 0;
}
Solution -「CTSC 2018」「洛谷 P4602」混合果汁的更多相关文章
- 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 ...
- [洛谷P4602] CTSC2018 混合果汁
问题描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 n 种果汁,编号为 0, 1, 2, . . . , n − 1.i 号果汁的美味度是 di,每升价格为 pi.小 R 在制作混合果汁时 ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
随机推荐
- yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别
yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别 简单概括: repo和epel的关系 repo是配置源的,即配置从哪里下载包(以及依赖关系)的. epel是作为桥 ...
- spring boot 集群 + Nginx --- 心得
1.前言 已经掌握了spring cloud 得使用 ,但这是在内部网络做业务 ,现在需要 在外部网络 访问内部网络 服务 ,引入了 服务端负载均衡 Nginx , Nginx 根据预定的策略 ,将请 ...
- XCTF-反序列化中_wakeup()函数
跳过_wakeup()魔法函数__wakeup(): 将在序列化之后立即被调用漏洞原理: 当反序列化字符串中,表示属性个数的值大于其真实值,则跳过__wakeup()执行 对于该题,先可以看到类xct ...
- 【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释
题目一 力扣143.重排链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list/ 1.描述 给定一个单链表L的头节点he ...
- 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernetes)-kubernetes/dashboard
本章介绍所需环境:ubuntu18.04,建立在上一篇微服务探索之路01篇已经安装了docker的基础上. 1 替换k8s镜像源为国内镜像 进入目录 cd /etc/apt/sources.list. ...
- winform设置所有窗体统一图标
class WindowHookerManager { static WindowHooker hooker = new WindowHooker(); public static void SetA ...
- IExposedPropertyTable与ExposedReference的使用
近期回顾Dead of the Book demo时,看见了它们的运用.感觉主要是用于ScriptableObject资源和Scene资源解耦: 并将这类做法规范化. 做一个小测试,IExposedP ...
- mesos是什么
听过不少人在讨论 Mesos,然而并不是很明白 Mesos 到底能够解决什么问题,使用场景是怎样的,周伟涛(国内较早一批接触使用 Docker,Mesos 等技术的开发者)用一句话形容它, Mesos ...
- jsp加载css失效的解决方法
问题: 有时候大家修改了css文件里的样式,但是刷新浏览器,利用工具看样式的时候,发现样式根本没加载或者说没更新, 其实这出现的问题就是缓存的问题 解决: 如何避免发生这种事,其实很简单,只需要每次请 ...
- undo和redo的区别
undo和redo的区别: undo一般用于事务的取消与回滚,记录的是数据修改前的值: redo一般用于恢复已确认但未写入数据库的数据,记录的是数据修改后的值.