BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】
题目链接
题解
明显要二分一下美味度,然后用尽量少的价格去购买饮料,看看能否买到\(L\)升,然后看看能否控制价格在\(g\)内
尽量少的价格,就优先先选完便宜的饮料,由于询问的是一定美味度范围的,主席树上询问即可
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 100005,maxm = 5000005;
const LL INF = 1000000000000000001ll;
inline LL read(){
LL out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,m;
struct node{
int d,p,l;
}e[maxn];
inline bool operator <(const node& a,const node& b){
return a.d < b.d;
}
int Maxp;
LL S[maxn],sum[maxm],val[maxm];
int ls[maxm],rs[maxm],cnt,rt[maxn];
void add(int& u,int pre,int l,int r,int pos,int v){
sum[u = ++cnt] = sum[pre]; val[u] = val[pre];
ls[u] = ls[pre]; rs[u] = rs[pre];
val[u] += 1ll * pos * v; sum[u] += v;
if (l == r) return;
int mid = l + r >> 1;
if (mid >= pos) add(ls[u],ls[pre],l,mid,pos,v);
else add(rs[u],rs[pre],mid + 1,r,pos,v);
}
LL query(int u,int v,int l,int r,LL ml){
if (!u) return 0;
if (l == r) return ml * l;
int mid = l + r >> 1;
LL t = sum[ls[u]] - sum[ls[v]];
if (t >= ml) return query(ls[u],ls[v],l,mid,ml);
return val[ls[u]] - val[ls[v]] + query(rs[u],rs[v],mid + 1,r,ml - t);
}
bool check(int d,LL g,LL L){
int pre = lower_bound(e + 1,e + 1 + n,(node){d,0,0}) - e - 1;
if (S[n] - S[pre] < L) return false;
return query(rt[n],rt[pre],1,Maxp,L) <= g;
}
int main(){
n = read(); m = read();
int M = 0;
REP(i,n){
e[i].d = read();
e[i].p = read();
e[i].l = read();
M = max(M,e[i].d);
Maxp = max(Maxp,e[i].p);
}
sort(e + 1,e + 1 + n);
for (int i = 1; i <= n; i++)
S[i] = S[i - 1] + e[i].l;
for (int i = 1; i <= n; i++){
add(rt[i],rt[i - 1],1,Maxp,e[i].p,e[i].l);
}
LL g,L;
while (m--){
g = read(); L = read();
int l = 1,r = M,mid;
while (l < r){
mid = l + r + 1 >> 1;
if (check(mid,g,L)) l = mid;
else r = mid - 1;
}
if (check(l,g,L)) printf("%d\n",l);
else puts("-1");
}
return 0;
}
BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】的更多相关文章
- BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树
分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...
- 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...
- 【BZOJ 4556】[Tjoi2016&Heoi2016]字符串 SAM+二分+主席树
这道题市面上就两种法:一种是SA+二分+主席树,一种是SAM+二分+主席树(有不少人打线段树合并???)(除此之外还有一种利用炒鸡水的数据的暴力SA,贼快.....)(当时学SA的时候没做这道题,现在 ...
- BZOJ2653 middle 【二分 + 主席树】
题目 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c ...
- [bzoj5343][Ctsc2018]混合果汁_二分答案_主席树
混合果汁 bzoj-5343 Ctsc-2018 题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升.现在要求用这$n$中果汁调配出$m$杯 ...
- BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...
- [CTSC2018]混合果汁(二分答案+主席树)
考场上写了60分的二分答案,又写了15分的主席树,然后就弃了.. 合起来就A了啊!主席树忘了开20倍空间最后还炸掉了. 最水的签到题被我扔了,主要还是不会用线段树求前缀和. 做法应该是比较显然的,首先 ...
- [bzoj2653][middle] (二分 + 主席树)
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- Codeforces Round #276 (Div. 1) E. Sign on Fence 二分+主席树
E. Sign on Fence Bizon the Champion has recently finished painting his wood fence. The fence consi ...
- bzoj1926[Sdoi2010]粟粟的书架 二分 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 1064 Solved: 421[Submit][Stat ...
随机推荐
- C#中在WebClient中使用post发送数据实现方法
很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地.Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法 ...
- CRC校验8
什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并 ...
- 爬虫之爬取斗鱼官网LOL部分主播的状态
一个爬虫小程序 爬取主播的排名及观看人数 import re import requests import request class Spider(): url = 'https://www.dou ...
- Go web表单
package main import ( "fmt" "html/template" "log" "net/http" ...
- python2.7练习小例子(十六)
16):题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 程序分析:利用 while 或 for 语句,条件为输入的字符不为 '\n'. 程序源代码: #!/u ...
- oracle杀死锁表的进程(转发+合并+自己实践)
之一: Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作 (1)锁表查询的代码有以下的形式:select count(*) from v$locked_object;sel ...
- 【转】手把手教你:Ubuntu14+apache2+django1.7+python2.7下网页/网站部署
本人亲自尝试了网上众多的部署网页/网站方法,绝大多数都未能试验成功,这次的项目光部署这块遇到了很多问题,大概耗费了我一个星期. 本着:王道论坛中的赠人玫瑰,手留余香的精神.我把自己一路所走的历程发布出 ...
- Gradle 设置本地meaven
repositories { maven { url uri("F:\\meaven")} }
- Notepad++删除空行的多种实现办法
Notepad++支持基础的正则表达式,同时由于自身丰富的插件和功能,所以删除空行或有空格的空行,有多种实现办法,条条大路通罗马,闪电博客抛砖引玉,供大家参考. 一.删除空行(不包括有空格类符号的空行 ...
- LeetCode高频题目(100)汇总-Java实现
LeetCode高频题目(100)汇总-Java实现 LeetCode高频题目(100)汇总-Java实现 目录 第01-50题 [Leetcode-easy-1] Two Sum [Le ...