LOJ 题目链接 & 洛谷题目链接

题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升。最多可以添加 \(l_i\) 升。有 \(m\) 次询问,每次给出两个数 \(G,L\),你可以将商店里的一些果汁混合起来,使得他们的总体积不小于 \(L\) 升,总价格不超过 \(G\) 元,问:选择的果汁中美味度最小值的最大值是多少。

\(1 \leq n,m \leq 10^5\),\(1 \leq d_i,p_i,l_i \leq 10^5\)

看到这种“最小值最大”的字眼,第一反应应该是二分吧(

将 \(d\) 数组排个序,二分出 \(mid\),显然我们只能取 \(d_i \geq mid\) 的果汁。

根据贪心的策略,我们肯定先取单价最小的果汁,用 \(min(l_i,L)\) 升体积做成混合果汁,需要 \(p_i \times min(l_i,L)\) 元的代价,如果还有剩余的体积就取单价第二小的果汁,如果还有就取第三小的,以此类推……

然后我就死在了这个地方,还是太菜了啊 qwq(

我们考虑以单价为下标建一棵权值线段树,每个节点上维护两个值,\(sum\) 表示价格在 \([l,r]\) 区间中所有果汁的体积之和,\(cst\) 表示价格在 \([l,r]\) 中所有果汁的单价与体积的乘积之和。

每次我们从根节点开始,如果 \(L\) 不超过左子树的 \(sum\) 值,递归左子树,否则答案加上右子树的代价再递归右子树。

由于 \(mid\) 值不确定,需要可持久化,时间复杂度 \(n\log^2n\)。

注意事项:需要判总体积是否 \(\geq L\) 升。

最后是代码:

//Coded by tzc_wk
/*
数据不清空,爆零两行泪。
多测不读完,爆零两行泪。
边界不特判,爆零两行泪。
贪心不证明,爆零两行泪。
D P 顺序错,爆零两行泪。
大小少等号,爆零两行泪。
变量不统一,爆零两行泪。
越界不判断,爆零两行泪。
调试不注释,爆零两行泪。
溢出不 l l,爆零两行泪。
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define giveup(...) return printf(__VA_ARGS__),0;
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define fillsmall(a) memset(a,0xcf,sizeof(a))
#define mask(a) (1ll<<(a))
#define maskx(a,x) ((a)<<(x))
#define _bit(a,x) (((a)>>(x))&1)
#define _sz(a) ((int)(a).size())
#define filei(a) freopen(a,"r",stdin);
#define fileo(a) freopen(a,"w",stdout);
#define fileio(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
#define put(x) putchar(x)
#define eoln put('\n')
#define space put(' ')
#define y1 y_chenxiaoyan_1
#define y0 y_chenxiaoyan_0
#define int long long
typedef pair<int,int> pii;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
inline void print(int x){
if(x<0){
putchar('-');
print(abs(x));
return;
}
if(x<=9) putchar(x+'0');
else{
print(x/10);
putchar(x%10+'0');
}
}
inline int qpow(int x,int e,int _MOD){
int ans=1;
while(e){
if(e&1) ans=ans*x%_MOD;
x=x*x%_MOD;
e>>=1;
}
return ans;
}
int n=read(),m=read();
int key[100005],hs[100005],cntt;
struct juice{
int d,p,l;
juice(){/*ycxakioi*/}
juice(int _d,int _p,int _l){
d=_d;p=_p;l=_l;
}
friend bool operator <(juice a,juice b){
return a.d<b.d;
}
} a[100005];
struct node{
int l,r,ch[2],sum,cst;
} s[100005<<5];
int ncnt=0,rt[100005];
inline void build(int &k,int l,int r){
k=++ncnt;s[k].l=l;s[k].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(s[k].ch[0],l,mid);
build(s[k].ch[1],mid+1,r);
}
inline void update(int &k,int pre,int p,int l){
k=++ncnt;s[k]=s[pre];
if(s[k].l==s[k].r){
s[k].sum+=l;
s[k].cst+=hs[p]*l;
return;
}
int mid=(s[k].l+s[k].r)>>1;
if(p<=mid) update(s[k].ch[0],s[pre].ch[0],p,l);
else update(s[k].ch[1],s[pre].ch[1],p,l);
s[k].sum=s[s[k].ch[0]].sum+s[s[k].ch[1]].sum;
s[k].cst=s[s[k].ch[0]].cst+s[s[k].ch[1]].cst;
}
inline bool check(int mid,int g,int l){
if(s[rt[mid]].sum<l) return 0;
int cur=rt[mid];
while(1){
if(s[cur].l==s[cur].r){
g-=hs[s[cur].l]*l;
break;
}
if(l<=s[s[cur].ch[0]].sum){
cur=s[cur].ch[0];
}
else{
l-=s[s[cur].ch[0]].sum;
g-=s[s[cur].ch[0]].cst;
cur=s[cur].ch[1];
}
}
return g>=0;
}
signed main(){
fz(i,1,n) a[i].d=read(),a[i].p=read(),a[i].l=read(),key[i]=a[i].p;
sort(key+1,key+n+1);
sort(a+1,a+n+1);
fz(i,1,n) if(key[i]!=key[i-1]) hs[++cntt]=key[i];
fz(i,1,n) a[i].p=lower_bound(hs+1,hs+cntt+1,a[i].p)-hs;
build(rt[n+1],1,cntt);
fd(i,n,1) update(rt[i],rt[i+1],a[i].p,a[i].l);
a[0].d=-1;
while(m--){
int g=read(),l=read();
int L=1,R=n,ans=0;
while(L<=R){
int mid=(L+R)>>1;
if(check(mid,g,l)) ans=mid,L=mid+1;
else R=mid-1;
}
cout<<a[ans].d<<endl;
}
return 0;
}

LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)的更多相关文章

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

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

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

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

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

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

  4. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

  5. 2018.09.14 洛谷P3567 [POI2014]KUR-Couriers(主席树)

    传送门 简单主席树啊. 但听说有随机算法可以秒掉%%%(本蒟蒻并不会) 直接维护值域内所有数的出现次数之和. 当这个值不大于区间总长度的一半时显然不存在合法的数. 这样在主席树上二分查值就行了. 代码 ...

  6. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  7. 洛谷P4559 [JSOI2018]列队(主席树)

    题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优 ...

  8. LOJ 3043: 洛谷 P5280: 「ZJOI2019」线段树

    题目传送门:LOJ #3043. 题意简述: 你需要模拟线段树的懒标记过程. 初始时有一棵什么标记都没有的 \(n\) 阶线段树. 每次修改会把当前所有的线段树复制一份,然后对于这些线段树实行一次区间 ...

  9. 洛谷P2839 [国家集训队]middle 主席树_二分

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...

随机推荐

  1. 【转】简述C和C++的学习历程

    简述C和C++的学习历程(转) --by:肖舸老师总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复. 一家之言,欢迎拍砖哈. 1.可以考虑先学习C. 大多数时候 ...

  2. vue如何监听数组的变化

    export function def (obj: Object, key: string, val: any, enumerable?: boolean) { Object.defineProper ...

  3. 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort

    概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...

  4. OO第二单元电梯作业总结

    目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...

  5. FastAPI 学习之路(五十六)将token存放在redis

    在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...

  6. 洛谷 P4555 [国家集训队]最长双回文串

    链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...

  7. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...

  8. 重建二叉树 牛客网 剑指Offer

    重建二叉树 牛客网 剑指Offer 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3, ...

  9. cm1 逆向分析

    目录 cm1 逆向分析 前言 查壳分析 逆向分析 代码分析 qmemcpy分析 sub_401020函数分析 sub_401050函数分析 加密算法分析 POC代码编写 cm1 逆向分析 前言 还是先 ...

  10. HTML 罗盘式时钟

    代码块: 1 <!DOCTYPE html> 2 <html lang="zh-hans"> 3 <head> 4 <meta chars ...