混合果汁 bzoj-5343 Ctsc-2018

题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升。现在要求用这$n$中果汁调配出$m$杯混合果汁。第$j$杯混合果汁的要求是总价格不多余$g_j$,总体积不小于$L_j$且美味度最大。一杯混合果汁的美味度为所有添加的果汁的美味度的最小值。求$m$杯混合果汁的美味度之和的最大值。

注释:$1\le n,m,d_i,p_i,l_i\le 10^5$,$1\le g_i,L_i\le 10^{18}$。


想法

显然每种混合果汁之间是独立的。

对于每一个询问,我们二分答案美味度。

这样的话所有比$mid$大的果汁随便选,满足询问条件。

我们判断当前的$mid$是否合法,其实就是判断一下组成$L_j$最少需要多少钱。

正确的选择肯定是选美味度大于$mid$中最便宜的,取到上限然后取第二便宜的。

这样的话我们既需要维护美味度序列,还需要保证价格递增。这是二维的,显然想到树套树。

其实如果只有两维的话主席树是完全可以胜任的。

进而我们把果汁按照美味度排序,在这个序列上以价格为权值建立主席树即可。

检验就是把主席树$mid$到后面这段权值线段树取出来。每次取最便宜的操作就相当于在权值线段树上二分即可。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; typedef long long ll;
const int N=1e5+5;
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,10000,stdin),p1==p2)?EOF:*p1++;}
ll rd() {ll x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
ll g,L;
int n,m,md,mp,tot;
int rt[N],ls[N*20],rs[N*20];
ll s[N*20],sz[N*20],sum[N];
struct node{int p,l;};
vector<node>t[N];
void update(int &x,int l,int r,int k,int v)
{
sz[++tot]=sz[x]+v;
s[tot]=s[x]+1ll*k*v;
ls[tot]=ls[x]; rs[tot]=rs[x]; x=tot;
if(l==r)return;int mid=(l+r)>>1;
if(k<=mid) update(ls[x],l,mid,k,v);
else update(rs[x],mid+1,r,k,v);
}
ll query(int x,int l,int r,ll k)
{
if(l==r) return l*k;
int mid=(l+r)>>1;
if(k<=sz[ls[x]])return query(ls[x],l,mid,k);
return s[ls[x]]+query(rs[x],mid+1,r,k-sz[ls[x]]);
}
bool check(int mid)
{
if(sum[mid]<L)return 0;
return query(rt[mid],1,mp,L)<=g;
}
int solve()
{
int l=0,r=md,ans=-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;i++)
{
int d=rd(),p=rd(),l=rd();
t[d].push_back((node){p,l});
md=max(md,d); mp=max(mp,p);
}
for(int i=md;i>=0;i--)
{
rt[i]=rt[i+1]; sum[i]=sum[i+1];
for(int j=0,k=t[i].size();j<k;j++)
{
update(rt[i],1,mp,t[i][j].p,t[i][j].l);
sum[i]+=t[i][j].l;
}
}
for(int i=1;i<=m;i++)
{
g=rd(),L=rd();
printf("%d\n",solve());
}
return 0;
}

小结:好题好题。本来是练习整体二分结果做成了主席树。

[bzoj5343][Ctsc2018]混合果汁_二分答案_主席树的更多相关文章

  1. BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】

    题目链接 BZOJ5343 题解 明显要二分一下美味度,然后用尽量少的价格去购买饮料,看看能否买到\(L\)升,然后看看能否控制价格在\(g\)内 尽量少的价格,就优先先选完便宜的饮料,由于询问的是一 ...

  2. [bzoj1614][Usaco2007Jan]Telephone Lines 架设电话线_二分答案_最短路

    Telephone Lines bzoj-1614 Usaco-2007Jan 题目大意:给你一个n个点m条边的带边权无向图,求最短路.可以选取k条边免费. 注释:$1\le n\le 10^3$,$ ...

  3. [校内模拟赛T3]火花灿灿_二分答案_组合数学_贪心

    火花灿灿 题目: 数据范围: 题解: 这个题真的是个神仙题. 我们对于每块石头维护一个$01$串. 这个$01$串的长度是操作次数. 如果$01$串的当前位是$1$,表示这次操作中当前石子被划分到了贡 ...

  4. BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  5. [Agc029C]Lexicographic constraints_进制_二分答案_贪心

    Lexicographic constraints 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_c 数据范围:略. 题解: 二分是显然的, ...

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

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

  7. BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案

    BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案 Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者, ...

  8. BZOJ_4590_[Shoi2015]自动刷题机_二分答案

    BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...

  9. BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列

    BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...

随机推荐

  1. JDBC连接Oracle工具类

    import java.sql.*;import java.util.ResourceBundle; /** * jdbc工具类,负责: * 1. 加载/注册数据库驱动程序 * 2. 获取数据库连接 ...

  2. [BZOJ1004][HNOI2008]Cards 群论+置换群+DP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. ...

  3. 转载:如何使用RFT自动打开IE

    如何在RFT测试脚本中打开IE浏览器?   第一步,配置应用程序进行测试: “配置”菜单 ——> “配置应用程序进行测试...”,进入下面这个界面,默认三个自带的应用程序,点击“添加”加入IE. ...

  4. oracle DBA笔试题

    Unix/Linux题目: 1.如何查看主机CPU.内存.IP和磁盘空间? cat /proc/cpuinfo cat /proc/meminfo ifconfig –a fdisk –l   2.你 ...

  5. Sass的的使用三

    [Sass]普通变量与默认变量普通变量定义之后可以在全局范围内使用. 默认变量sass 的默认变量仅需要在值后面加上 !default 即可.sass 的默认变量一般是用来设置默认值,然后根据需求来覆 ...

  6. swift派发机制的核心是确定一个函数能否进入动态派发列表

    swift派发机制的核心是确定一个函数能否进入动态派发列表

  7. 常见的HTTP相应状态码

    200:请求被正常处理204:请求被受理但没有资源可以返回206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源.301:永 ...

  8. 02Hibernate基本配置

    Hibernate基本配置 1.引入jar 2.建立项目 3.创建实体类 package com.sqlserver.domain; public class Customer { long cust ...

  9. js【table】合并行,合并列

    eg: function hbh() { var tab = document.getElementById("tableID"); var maxCol = 2, val, co ...

  10. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API

    RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...