题目描述

小 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 。

输入输出样例

输入样例#1: 复制

3 4
1 3 5
2 1 3
3 2 5
6 3
5 3
10 10
20 10
输出样例#1: 复制

3
2
-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]混合果汁(主席树)的更多相关文章

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

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

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

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

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

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

  4. 洛谷P2617 Dynamic Rankings (主席树)

    洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...

  5. 洛谷P3567 KUR-Couriers [POI2014] 主席树/莫队

    正解:主席树/莫队 解题报告: 传送门! 这题好像就是个主席树板子题的样子,,,? 毕竟,主席树的最基本的功能就是,维护一段区间内某个数字的个数 但是毕竟是刚get到主席树,然后之前做的一直是第k大, ...

  6. 洛谷P3567[POI2014]KUR-Couriers(主席树+二分)

    题意:给一个数列,每次询问一个区间内有没有一个数出现次数超过一半 题解: 最近比赛太多,都没时间切水题了,刚好日推了道主席树裸题,就写了一下 然后 WA80 WA80 WA0 WA90 WA80 ?? ...

  7. 洛谷P3567 [POI2014]KUR-Couriers 主席树

    挺裸的,没啥可讲的. 不带修改的主席树裸题 Code: #include<cstdio> #include<algorithm> using namespace std; co ...

  8. 洛谷$P3302$ 森林 $[SDOI2013]$ 主席树

    正解:主席树 解题报告: 传送门! 口胡一时爽代码火葬场 这题想法不难,,,但显然的是代码应该还挺难打的 但反正我也不放代码,就写下题解趴$QwQ$ 第一问就是个$Count\ on\ a\ tree ...

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

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

随机推荐

  1. Python爬虫教程-04-response简介

    Spider-04-response简介 本小节介绍urlopen的返回对象,和简单调试方法 案例v3 研究request的返回值,输出返回值类型,打印内容 geturl:返回请求对象的url inf ...

  2. volley4--RequestQueue

    源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...

  3. JS Error 内置异常类型 处理异常 Throw语句

    Exceptional Exception Handling in JavaScript       MDN资料 Anything that can go wrong, will go wrong. ...

  4. bootstrap-table 分页增删改查之一(分页)

    记录一下 bootstrap-table插件的使用 先看下效果图 首先是导入js <!--js jquery --> <script type="text/javascri ...

  5. spring boot(7)-mybatis全注解化

    关于配置数据库可以参考上一篇文章,这里只讲mybatis pom.xml <!-- 引入mybatis --> <dependency> <groupId>org. ...

  6. 让UpdatePanel支持文件上传(1):开始 .

    UpdatePanel从一开始就无法支持AJAX的文件上传方式.Eilon Lipton写了一篇文章解释了这个问题的原因.文章中提供了两个绕开此问题的方法: 将“上传”按钮设为一个传统的PostBac ...

  7. 打通版微社区(3):在Web服务器上部署memcache For DZ3.2

    写在前面:首先这个数据库加速程序的原理,是将数据库内容缓存到Web服务器的内存上,也就是内存换速度.我本次微社区的应用其实应该用不了这个,只是看到好多DZ论坛部署的都安装了这个,我就练手一下以便不时之 ...

  8. 打通版微社区(1):PHP环境部署 for DZX3.2

    写在前面:本文参考了http://blog.sina.com.cn/s/blog_513be2630101linz.html非常感谢博主此文对我此次操作帮助很大.PHP的windows部署方案主要分为 ...

  9. August 02nd 2017 Week 31st Wednesday

    Love means never having to say you are sorry. 爱就是永远不必说对不起. If there is ture love, you will never do ...

  10. 021.8 properties(开发使用频率高)

    内容:Properties基本存取.存储到持久化设备.从持久化设备读取.简单模拟收费软件试用结束##Properties——有配置文件的功能.    特点:    1.Hash table的子类,ma ...