洛谷P4602 [CTSC2018]混合果汁(主席树)
题目描述
小 R 热衷于做黑暗料理,尤其是混合果汁。
商店里有 nn 种果汁,编号为 0,1,\cdots,n-10,1,⋯,n−1 。 ii 号果汁的美味度是 d_idi ,每升价格为 p_ipi 。小 R 在制作混合果汁时,还有一些特殊的规定,即在一瓶混合果汁中, ii 号果汁最多只能添加 l_ili 升。
现在有 mm 个小朋友过来找小 R 要混合果汁喝,他们都希望小 R 用商店里的果汁制作成一瓶混合果汁。其中,第 jj 个小朋友希望他得到的混合果汁总价格不大于 g_jgj ,体积不小于 L_jLj 。在上述这些限制条件下,小朋友们还希望混合果汁的美味度尽可能地高,一瓶混合果汁的美味度等于所有参与混合的果汁的美味度的最小值。请你计算每个小朋友能喝到的最美味的混合果汁的美味度。
输入输出格式
输入格式:
输入第一行包含两个正整数 n, mn,m ,表示果汁的种数和小朋友的数量。接下来 nn 行,每行三个正整数 d_i, p_i, l_idi,pi,li ,表示 ii 号果汁的美味度为 d_idi ,每升价格为 p_ipi ,在一瓶果汁中的添加上限为 l_ili 。
接下来 mm 行依次描述所有小朋友:每行两个数正整数 g_j, L_jgj,Lj 描述一个小朋友,表示他最多能支付 g_jgj 元钱,他想要至少 L_jLj 升果汁。
输出格式:
对于所有小朋友依次输出:对于每个小朋友,输出一行,包含一个整数,表示他能喝到的最美味的混合果汁的美味度。如果无法满足他的需求,则输出 -1−1 。
输入输出样例
说明
对于所有的测试数据,保证 n, m \le 100000n,m≤100000 , 1 \le d_i,p_i,l_i \le 10^5, 1 \le g_j, L_j \le 10^{18}1≤di,pi,li≤105,1≤gj,Lj≤1018 。
首先二分一波美味度
然后我们需要在美味度大于当前值的果汁中取,很明显是价格越小的越先取到
但是直接这样做复杂度是$O(n^2log^2n)$的
对于任意一个美味度,我们可以把它能取得的价格用线段树维护
然后可持久化一下就好了
时间复杂度$O(nlog^2n)$
#include<cstdio>
#include<algorithm> using namespace std;
const int MAXN = * 1e6 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M;
int root[MAXN];
struct Juice {
int D, P, L;
bool operator < (const Juice &rhs) const{
return D < rhs.D;
}
}a[MAXN];
struct node {
int ls, rs, tj, mon;
}T[MAXN];
int limit = , tot = ;
#define ls(x) T[x].ls
#define rs(x) T[x].rs
int insert(int &now, int pre, int l, int r, int pos, int val) {
now = ++tot;
T[now].ls = T[pre].ls; T[now].rs = T[pre].rs; T[now].tj = T[pre].tj + val, T[now].mon = T[pre].mon + val * pos;
if(l == r) return now;
int mid = (l + r) >> ;
if(pos <= mid) T[now].ls = insert(T[now].ls, T[pre].ls, l, mid, pos, val);
else T[now].rs = insert(T[now].rs, T[pre].rs, mid + , r, pos, val);
return now;
}
int Query(int now, int pre, int l, int r, int money) {
if(l == r) {return min(money / l, T[now].tj - T[pre].tj);}
int used = T[ls(now)].mon - T[ls(pre)].mon, mid = l + r >> ;
if(used <= money)
return Query(rs(now), rs(pre), mid + , r, money - used) + T[ls(now)].tj - T[ls(pre)].tj;
else
return Query(ls(now), ls(pre), l, mid, money);
}
int check(int pos, int G, int L) {
int ans = Query(root[N], root[pos - ], , limit, G);
return ans >= L;
}
int Solve(int G, int L) {
int l = , r = N, ans = ;
while(l <= r) {
int mid = l + r >> ;
if(check(mid, G, L)) ans = mid, l = mid + ;
else r = mid - ;
}
return ans == ? - : a[ans].D;
}
main() {
#ifdef WIN32
freopen("a.in", "r", stdin);
#endif
N = read(), M = read();
for(int i = ; i <= N; i++)
a[i].D = read(), a[i].P = read(), a[i].L = read(), limit = max(a[i].P, limit);
sort(a + , a + N + );
for(int i = ; i <= N; i++)
insert(root[i], root[i - ], , limit, a[i].P, a[i].L);
while(M--) {
int G = read(), L = read();
printf("%lld\n", Solve(G, L));
}
}
洛谷P4602 [CTSC2018]混合果汁(主席树)的更多相关文章
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
- [洛谷P4602] CTSC2018 混合果汁
问题描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 n 种果汁,编号为 0, 1, 2, . . . , n − 1.i 号果汁的美味度是 di,每升价格为 pi.小 R 在制作混合果汁时 ...
- BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...
- 洛谷P2617 Dynamic Rankings (主席树)
洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...
- 洛谷P3567 KUR-Couriers [POI2014] 主席树/莫队
正解:主席树/莫队 解题报告: 传送门! 这题好像就是个主席树板子题的样子,,,? 毕竟,主席树的最基本的功能就是,维护一段区间内某个数字的个数 但是毕竟是刚get到主席树,然后之前做的一直是第k大, ...
- 洛谷P3567[POI2014]KUR-Couriers(主席树+二分)
题意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半 题解: 最近比赛太多,都没时间切水题了,刚好日推了道主席树裸题,就写了一下 然后 WA80 WA80 WA0 WA90 WA80 ?? ...
- 洛谷P3567 [POI2014]KUR-Couriers 主席树
挺裸的,没啥可讲的. 不带修改的主席树裸题 Code: #include<cstdio> #include<algorithm> using namespace std; co ...
- 洛谷$P3302$ 森林 $[SDOI2013]$ 主席树
正解:主席树 解题报告: 传送门! 口胡一时爽代码火葬场 这题想法不难,,,但显然的是代码应该还挺难打的 但反正我也不放代码,就写下题解趴$QwQ$ 第一问就是个$Count\ on\ a\ tree ...
- Solution -「CTSC 2018」「洛谷 P4602」混合果汁
\(\mathcal{Description}\) Link. \(n\) 种果汁,第 \(i\) 种美味度为 \(d_i\),每升价格 \(p_i\),一共 \(l_i\) 升.\(m\) ...
随机推荐
- 使用WICleanup清理Windows Installer 冗余文件
使用WICleanup清理Windows Installer 冗余文件 | 浏览:816 | 更新:2015-11-02 10:43 | 标签:Win7 Win10 1 2 3 4 5 6 7 分步阅 ...
- Python爬虫教程-09-error 模块
Python爬虫教程-09-error模块 今天的主角是error,爬取的时候,很容易出现错,所以我们要在代码里做一些,常见错误的处,关于urllib.error URLError URLError ...
- 【Oracle】Update方法
1.单表更新 update customers set city_name='山西省太原市' where city_name='山西太原' 2.两表(多表)关联update -- 被修改值由另一个表运 ...
- 入门级 - 码云(Gitee),GitHub 教程
这篇文章的目的是记录我的关于GitHub的内容,从注册.下载直到设置成功每一步都有解释,其中有一些截图或者代码来自于网络. GitHub和码云均基于Git,所以两者的操作方法基本一致,只需要学习其中一 ...
- 第一课 PPT 所学内容总结
制作PPT时要注意三要素即:图形,颜色搭配,字数适当. 感悟:制作一个好的PPT也并不需要华丽的画面.只需清晰的表达出自己想要表达的,就是一个好PPT.
- 自动化测试全套流程(一)-搭建Jenkins环境
前提 既然要做自动化测试,那我们就做得彻底一些,将整套系统部署在Linux服务器上,在搭建Jenkins环境之前,我已经通过VirtualBox安装了一个CentOS的服务器,搭建Jenkins是基于 ...
- Win10离线安装.NET Framework 3.5的方法技巧(附离线安装包下载)
原文链接: https://www.windows10.pro/win10-net-framework-3-5/ 在Windows10中,当我们安装某些软件的时候会提示“你的电脑上的应用需要使用以下W ...
- SQL server reporting service - rsReportServerNotActivated error solution
描述: 今天在原有的数据库版本上增加了Reporting Service 功能,数据库完成安装后,没有发现ReportServer和 ReportServerTemp 两个数据库 于是从其他服务器上, ...
- jQueryeasyUI+Hibernate+struts2实现商城后台管理之复合类别
一.在Category.java中添加父类别和子类别两个变量,并生成get/set方法
- UVA 10288 Coupons---概率 && 分数类模板
题目链接: https://cn.vjudge.net/problem/UVA-10288 题目大意: 一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最 ...