题意:给出每一种果汁的美味度,价格,升数;

m个询问,每个询问给出最高上限的钱g,以及给出最少的w

意思是,最多用g的钱去买最少l的果汁,问能得到的最大美味度;

美味度是取所有果汁中美味度的最小值;

所以这道题有:美味度,价格,升数,

一开始想的时候,因为多了一个条件不知道怎么操作,看了题解之后才发现,将其中的美味度拿来二分了;

也就是说,题目中的美味度取值,是二分出来的;

那么如何建树呢?

因为美味度二分,自然建树的时候是拿美味度作为主体;

也就是说,按美味度从小到大建树(小的美味度可以包括大的美味度)

然后价格作为权值,维护 花费和升数;

那么   在最后提问的时候,我们给定一个l,r; 二分他的mid;

如果他的mid二分出来的值符合,则更新;

那么   如何二分呢,我们将钱最为一个条件放入数中去深搜,如果在这个钱的范围内能找到大于等于升数的,就ans=mid,r=mid-1;

否则则反;

 #include<cstdio>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
const ll maxn=1e5+;
ll sum[maxn],b[maxn],root[maxn];
struct node
{
ll d,p,l;
}G[maxn];
struct Node
{
ll ln,rn;
ll sum,val;
}tree[maxn<<]; ll cnt;
bool cmp(node a,node b)
{
return a.d>b.d;
}
void update(ll pos,ll &x,ll y,ll l,ll r,ll p,ll k)
{
tree[++cnt]=tree[y];x=cnt;
tree[x].sum+=p*k;
tree[x].val+=k;
if(l==r) return;
ll mid=l+r>>;
if(pos<=mid) update(pos,tree[x].ln,tree[y].ln,l,mid,p,k);
else update(pos,tree[x].rn,tree[y].rn,mid+,r,p,k);
}
ll query(ll root,ll l,ll r,ll limit)
{
if(l==r){
if(tree[root].val*b[l]>=limit) return limit/b[l];
else return tree[root].val;
}
ll mid=l+r>>;
ll left=tree[root].ln,right=tree[root].rn;
if(tree[left].sum>limit) return query(left,l,mid,limit);
else return tree[left].val+query(right,mid+,r,limit-tree[left].sum);
}
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=;i<=n;i++){
scanf("%lld%lld%lld",&G[i].d,&G[i].p,&G[i].l);
b[i]=G[i].p;
}
sort(b+,b++n);
ll limit=unique(b+,b++n)-b-;
sort(G+,G++n,cmp);
for(ll i=;i<=n;i++){
sum[i]=sum[i-]+G[i].l;
ll pos=lower_bound(b+,b++limit,G[i].p)-b;
update(pos,root[i],root[i-],,limit,G[i].p,G[i].l);
}
while(m--){
ll g,w;
scanf("%lld%lld",&g,&w);
if(sum[n]<w){
printf("-1\n");
continue;
}
ll left=lower_bound(sum+,sum++n,w)-sum;
ll right=n,ans=-;
while(left<=right){
ll mid=left+right>>;
if(query(root[mid],,limit,g)>=w){
ans=mid;right=mid-;
}
else left=mid+;
}
if(ans==-) printf("-1\n");
else printf("%lld\n",G[ans].d);
}
return ;
}

主席树+二分 p4602的更多相关文章

  1. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

  2. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  3. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  4. HDU - 4866 主席树 二分

    题意:在x轴\([1,X]\)内的上空分布有n个占据空间\([L_i,R_i]\),高度\(D_i\)的线段,射中线段的得分为其高度,每次询问从x轴的\(x\)往上空射的最近k个线段的总得分,具体得分 ...

  5. POJ 6621: K-th Closest Distance(主席树 + 二分)

    K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

  6. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  7. 13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 2224: Boring Counting Time Limit: 3 Sec   ...

  8. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  9. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...

随机推荐

  1. JavaDay2(上)

    Java learning_Day2(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...

  2. 2020 Plan

    1. English IELTS  7.0 IELTS word 3271,  10 words diff 2 Grammar framework IELTS writing Friends foll ...

  3. Unable to create initial connections of pool. spring boot mysql

    Unable to create initial connections of pool. 在链接url里添加 将useSSL=true改为useSSL=false 只能说明服务器没有打开SSL功能

  4. PHP实现导出CSV文件

    在做导出一个信息表为excel文件这个功能完成之后,自己用得好好的,但是到HR那边就告诉我导出的文件无法用她电脑上的office打开,心想,兼容没做好,想问下她的版本号,结果半天没回复消息.我老大来了 ...

  5. 使用饿了么el-date-picker里及如何将后台给的时间戳js转化为时间格式

    首先代码是这个样子的,使用v-model <el-date-picker v-model="formData.createTime" :disabled="true ...

  6. BindingException: Invalid bound statement (not found)问题

  7. XSS挑战之旅,学习笔记

    第一关: http://test.ctf8.com/level1.php?name=test 观察到通过get方式传参有会显, 直接打最简单的xss playload: <script>a ...

  8. 神器扒网站——teleport ultra

    在平时的开发或者学习的过程中,我们难免会看到一些让人心动的网站,于是自己想把它搞下来,自己手工一个文件一个文件把它保存下来也可以实现,完成了也累得够呛,有一款扒站的神器,可以把你所喜欢的目标网站整个网 ...

  9. 使用 C++11 编写可复用多线程任务池

    类的功能 Task (任务基类) 该类主要实现一个任务类 virtual int doWork() = 0; TaskQueue (任务队列) 该类主要针对任务的存储.删除.撤回等状态做管理 Thre ...

  10. 高通量计算框架HTCondor(六)——拾遗

    目录 1. 正文 1.1. 一些问题 1.2. 使用建议 2. 相关 1. 正文 1.1. 一些问题 如果真正要将HTCondor高通量计算产品化还需要很多工作要做,HTCondor并没有GUI界面, ...