[CTSC2018]混合果汁 二分 套 主席树上二分
题意:
n种果汁,第iii种果汁的美味程度是did_idi有lil_ili升,价格是pip_ipi升
mmm个询问,要求使用果汁的总量不小于LimLimLim,价格不超过GGG,最大化所用的果汁的美味程度最小值
思路:
大体思路:
首先二分出来一个taste,然后在比taste高的里面去找一些价格少的,且能凑到L升的果汁,检查是否能凑出。
我们发现题目询问很多次,那么我们对于每一次的询问二分,在二分检查时肯定不可以O(n)去检查,因为这样时间复杂度就变成了O(m∗n∗logn)O(m*n*logn)O(m∗n∗logn)了,我么利用主席树。
首先把按照tastetastetaste排序,二分一个答案tastetastetaste,那么我们肯定是贪心地选择美味程度不小于tastetastetaste的并且最便宜的果汁
可以发现其具有单调性,考虑二分一个tastetastetaste给美味程度不小于tastetastetaste的果汁建立一颗以价格为下标的线段树
每个节点记录一下果汁总量和价格和,这样就可以在线段树上二分得到LLL对应的价格了
代码:
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;const int maxn=1e5+10;struct E{int taste,price,v;bool operator <(const E & a)const{return taste<a.taste;}
}a[maxn];int n,m,cnt;
int rt[maxn];
long long treecost[maxn*50],treesum[maxn*50];
int ls[maxn*50],rs[maxn*50];void updata(int &node,int start,int ends,int lst,long long pos,long long val){ //val 多少升node=++cnt;ls[node]=ls[lst];rs[node]=rs[lst];treecost[node]=treecost[lst]+pos*val;treesum[node]=treesum[lst]+val;if(start==ends) return ;int mid=(start+ends)>>1;if(pos<=mid) updata(ls[node],start,mid,ls[lst],pos,val);else updata(rs[node],mid+1,ends,rs[lst],pos,val);
}long long sumnow;//sum 表示的是容积bool query(int start,int ends,int x,int y,long long rem){if(treesum[y]-treesum[x]<rem) return false;if(start==ends){sumnow+=rem*start;return true;}int mid=(start+ends)>>1;long long lsum=treesum[ls[y]]-treesum[ls[x]];if(lsum>=rem){return query(start,mid,ls[x],ls[y],rem);}else{sumnow+=treecost[ls[y]]-treecost[ls[x]];return query(mid+1,ends,rs[x],rs[y],rem-lsum);}
}int imax=1;
bool che(int x,long long cost,long long tot){sumnow=0;if(query(1,imax,rt[x-1],rt[n],tot)==false) return false;return sumnow<=cost;}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i].taste>>a[i].price>>a[i].v;imax=max(imax,a[i].price);}sort(a+1,a+1+n);for(int i=1;i<=n;i++){updata(rt[i],1,imax,rt[i-1],a[i].price,a[i].v);}for(int i=1;i<=m;i++){long long pric,L;cin>>pric>>L;int l=1,r=n,ans=-1;while(l<=r){int mid=(l+r)>>1;if(che(mid,pric,L)){ans=a[mid].taste;l=mid+1;}else r=mid-1;}cout<<ans<<endl;}}
[CTSC2018]混合果汁 二分 套 主席树上二分相关推荐
- P2839 [国家集训队]middle(二分 套 主席树)
P2839 [国家集训队]middle 有一个长度为nnn的序列,有mmm次询问,每次询问a,b,c,da, b, c, da,b,c,d,为l∈[a,b],r∈[c,d]l \in [a, b], ...
- H - Hello Ms. Ze(树状数组套主席树,线段树上二分)
H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...
- BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...
- BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】
题目链接 BZOJ5343 题解 明显要二分一下美味度,然后用尽量少的价格去购买饮料,看看能否买到\(L\)升,然后看看能否控制价格在\(g\)内 尽量少的价格,就优先先选完便宜的饮料,由于询问的是一 ...
- P4602 [CTSC2018]混合果汁(主席树)
P4602 [CTSC2018]混合果汁 共有nnn种果汁,第iii种果汁的美味度为did_idi,每升价格为pip_ipi,在一瓶混合果汁中,最多只能添加lil_ili升. 有mmm个询问,每 ...
- Just h-index(主席树+二分)
链接:https://ac.nowcoder.com/acm/contest/1107/C 来源:牛客网 找一段区间内,大于等于这个数的个数大于等于这个数本身,问符合条件的最大值是多少. 思路:把数据 ...
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...
- 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)
传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...
最新文章
- oracle sql 全是子查询查询速度太慢如何优化_如果面试官问你如何优化mysql分页查询,请把这篇文章甩给他!...
- 选择排序 C++代码实现及性能分析 恋上数据结构笔记
- 滨州行谋定乡音叙乡情-农业大健康·万祥军:考察特色产业
- lass翻译_【专题讲座】政务翻译人才培训系列讲座(1)
- 修改date格式 java_如何用Java更改日期格式?
- 这个世界是怎么了?做商业软件的怎么越来越流氓了?
- MyBatis(七)------MyBatis映射器(resultMap元素)
- [JVM] Java虚拟机栈
- 如何正确使用条码标签打印软件
- 什么算法计算地图上从A点到B点的方向?
- CVPR 2022 | AAAI2022 | WACV 2022 超分辨率(super-resolution)方向上接收论文总结
- 淘宝关键词API接口
- ntp校时器(网络对时服务器)自动化系统技术应用方案
- oracle+sql+按中文拼音排序,Oracle 中文字段进行排序的sql语句
- STL:: allocator之deallocate destory的区别与联系
- SteamVR 2.x 手柄触摸3D物体(11)
- VSCode更新失败无法打开,快捷方式无法正常工作
- 机器学习_吴恩达-总
- python echo含义_echo什么意思
- vue 启动项目时动态切换 ip