5343: [Ctsc2018]混合果汁


题目描述

小 R 热衷于做黑暗料理,尤其是混合果汁。

商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) 。\(i\) 号果汁的美味度是 \(d_i\),每升价格为 \(p_i\)。小 R 在制作混合果汁时,还有一些特殊的规定,即在一瓶混合果汁中,\(i\) 号果汁最多只能添加 \(l_i\) 升。

现在有 \(m\) 个小朋友过来找小 R 要混合果汁喝,他们都希望小 R 用商店里的果汁制作成一瓶混合果汁。其中,第 \(j\) 个小朋友希望他得到的混合果汁总价格不大于 \(g_j\),体积不小于 \(L_j\)。在上述这些限制条件下,小朋友们还希望混合果汁的美味度尽可能地高,一瓶混合果汁的美味度等于所有参与混合的果汁的美味度的最小值。请你计算每个小朋友能喝到的最美味的混合果汁的美味度。

输入输出格式

输入格式:

输入第一行包含两个正整数 \(n, m\),表示果汁的种数和小朋友的数量。接下来 \(n\) 行,每行三个正整数 \(d_i, p_i, l_i\),表示 \(i\) 号果汁的美味度为 \(d_i\),每升价格为\(p_i\),在一瓶果汁中的添加上限为 \(l_i\)。

接下来 \(m\) 行依次描述所有小朋友:每行两个数正整数 \(g_j, L_j\)描述一个小朋友,表示他最多能支付 \(g_j\) 元钱,他想要至少 \(L_j\) 升果汁。

输出格式:

对于所有小朋友依次输出:对于每个小朋友,输出一行,包含一个整数,表示他能喝到的最美味的混合果汁的美味度。如果无法满足他的需求,则输出 \(-1\)。

说明

对于所有的测试数据,保证 \(n, m \le 100000\),\(1 \le d_i,p_i,l_i \le 10^5, 1 \le g_j, L_j \le 10^{18}\)。

测试点编号 \(n=\) \(m=\) 其他限制
1,2,3 \(10\) \(10\)
4,5,6 \(500\) \(500\)
7,8,9 \(5000\) \(5000\)
10,11,12 \(100000\) \(100000\) \(p_i=1\)
13,14,15 \(100000\) \(100000\) \(l_i=1\)
16,17,18,19,20 \(100000\) \(100000\)

题目分析:

考虑大暴力。

假设枚举所有的\(d\),可以发现从大到小答案是单调的。

那么我们先按照\(d\)排一遍序,然后二分这个\(d\),对于每个d直接暴力寻找是否可以满足条件,不难发现这个算法复杂度是\(O(n^2log^2n)\)的。

思考如何优化掉一个\(n\),发现可以对价格建立一棵权值线段树,然后对于二分的\(d\)就查询当前的状态是否能够满足总价格小于\(g\),发现这个\(d\)是可持久化的,可以用主席树实现。

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+7;
#define ll long long
#define mid ((l+r>>1))
struct Node{
int d,p,l;
bool operator <(const Node &rhs)const{return d<rhs.d;}
}a[MAXN];
struct Segtree{
ll v,w;
}st[MAXN<<5];
int L[MAXN<<5],R[MAXN<<5],T[MAXN],size;
int n,m;
ll g,lim;
inline ll read()
{
ll x=0,c=1;char ch=' ';
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
while(ch=='-') c*=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return c*x;
}
int update(int pre,int l,int r,int x,int v,ll w)
{
int rt=++size;
L[rt]=L[pre],R[rt]=R[pre],st[rt].v=st[pre].v+v,st[rt].w=st[pre].w+w;
if(l==r) return rt;
if(x<=mid) L[rt]=update(L[pre],l,mid,x,v,w);
else R[rt]=update(R[pre],mid+1,r,x,v,w);
return rt;
}
ll query(int v,int l,int r,ll x)
{
if(l==r) return (ll)x*l;
if(st[L[v]].v>=x) return query(L[v],l,mid,x);
else return st[L[v]].w+query(R[v],mid+1,r,x-st[L[v]].v);
}
ll solve()
{
g=read();lim=read();
if(lim>g) return -1;
int l=0,r=n,ans=0;
while(l<=r){
ll Mid=l+r>>1;
ll d=query(T[Mid],1,MAXN,lim);
if(lim<=st[T[Mid]].v&&d<=g) ans=Mid,l=Mid+1;
else r=Mid-1;
}
return a[ans].d;
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++){
a[i].d=read();a[i].p=read();a[i].l=read();
}
sort(a+1,a+n+1);
a[0].d=-1;
T[n+1]=++size;
for(int i=n;i>=1;i--){
T[i]=update(T[i+1],1,MAXN,a[i].p,a[i].l,(ll)a[i].l*a[i].p);
}
T[0]=T[1];
while(m--) printf("%lld\n",solve());
return 0;
}

[Bzoj]5343: [Ctsc2018]混合果汁的更多相关文章

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

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

  2. Luogu 4602 [CTSC2018]混合果汁

    BZOJ 5343 福利题. 对于每一个询问可以二分$d$,然后把满足条件的果汁按照$p$从小到大排序贪心地取$L$升看看满不满足价格的条件. 那么按照$p$建立权值主席树,$chk$的时候在主席树上 ...

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

    BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...

  4. BZOJ5343 & 洛谷4602 & LOJ2555:[CTSC2018]混合果汁——题解

    https://www.luogu.org/problemnew/show/P4602 https://loj.ac/problem/2555 https://www.lydsy.com/JudgeO ...

  5. [bzoj5343][Ctsc2018]混合果汁_二分答案_主席树

    混合果汁 bzoj-5343 Ctsc-2018 题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升.现在要求用这$n$中果汁调配出$m$杯 ...

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

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

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

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

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

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

  9. [ctsc2018] 混合果汁 【可持久化线段树】【二分答案】

    题目分析 首先考虑到最小值最大,二分答案.假设答案为k,显然这满足单调性.如果某个k使得这个情况下选不出.那么比k大的一定也选不出,所以二分答案. 接着我们可以贪心,当我们确认了k以后,一定会优先选费 ...

随机推荐

  1. 《转》适用于开发人员的10个最佳ASP.NET的CMS系统

    1) mojoportal mojoPortal 是一个开源的.用 C# 编写的站点框架和内容管理系统,可以运行在 Windows 中的 ASP.NET 和 Linux/Mac OS X 中的 Mon ...

  2. 网络虚拟化之FlowVisor:网络虚拟层(上)

    概念解释:切片:虚拟网络的一个实例 一. 网络虚拟化(虚拟网络) 人类社会的发展在很大方面得益于自然界,飞机受益于鸟,雷达受益于蝙蝠等等,所以专门有个学科为仿生学就是研究和模仿生物的特殊本质,利用生物 ...

  3. 170306、wamp中的Apache开启gzip压缩提高网站的响应速度

    一个网站的响应速度决定该网站的人气和质量,所以wamp配置的服务器也需要支持giz压缩来提高网站的响应速度,如何开启wamp的gzip压缩呢,经过在网站查找资料结合自己服务器中的配置,现在将这个方法分 ...

  4. 学习使用turtlebot2——安装ROS Indigo系统

    最近在学习使用turtlebot2,特此做一些学习记录. 安装ROS前要先决定自己电脑的Ubuntu(乌班图)系统.现在学习ROS常使用的Ubuntu系统有Ubuntu 16.04 和Ubuntu14 ...

  5. Oracle数据库设计第三范式

    一.数据库设计范式及其意义和不足 数据库的设计范式是数据库设计所需要满足的规范,数据库的规范化是优化表的结构和优化把数据组织到表中的方式,这样使数据更明确,更简洁.实践中,通常把一个数据库分成两个或多 ...

  6. 在Sql Server中使用证书加密数据

    IF NOT EXISTS () CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'QWE23987zxJKL569&agf1$94467GRkjg5k3 ...

  7. 将Android studio的工程导入到eclipse中

    自从Android Studio(后面称AS)推出后,越来越多的项目都使用AS开发. AS往eclipse迁移的方法: 其实很简单,代码都是一样的,从AS工程中找到与Eclipse工程对应的文件,放到 ...

  8. Linux network 资料链接

    1.iptables 基础 https://wiki.centos.org/HowTos/Network/IPTables 2.HOWTOs on netfilter site http://www. ...

  9. 0408-服务注册与发现-Eureka常用配置

    一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_appendix ...

  10. golang SQLite3性能测试

    SQLite是个小型的数据库,很简洁,即支持文件也支持内存,比较适合小型的独立项目,在没有网络的时候做一些复杂的关系数据存储和运算. 为了考察性能做10M(1000万)条记录的测试,测试机4CPU.8 ...