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

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. Spring组件BeanDefinition 源码解析

    BeanDefinition 继承图 继承的接口 BeanMetadataElement接口 将由承载配置源对象的bean元数据元素的类实现. 包含一个getSource的方法,可以获取到MetaDa ...

  2. prach定点化处理

  3. Android Q 接入 MQTT

    Android Q 接入 MQTT 首先在APP 下引入mqtt的库 implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1 ...

  4. nginx配置之后接口状态200,但是无返回数据问题小记

    nginx配置可能有问题.导致nginx不能解析PHP文件,检测nginx里对于php的配置信息. location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; f ...

  5. TAB_JG_COMMAND_SERVERINFO

    简介 存储设备基本信息 表结构

  6. 动态生成sku组合输入列表

    <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv=&quo ...

  7. JS高级---数组和伪数组

    数组和伪数组  伪数组和数组的区别 真数组的长度是可变的 伪数组的长度不可变 function f1() { var sum = 0; for (var i = 0; i < arguments ...

  8. TCP的粘包和拆包问题及解决

    前言 TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit ...

  9. BBR在实时音视频领域的应用

    小议BBR算法 BBR全称Bottleneck Bandwidth and RTT,它是谷歌在2016年推出的全新的网络拥塞控制算法.要说明BBR算法,就不能不提TCP拥塞算法. 传统的TCP拥塞控制 ...

  10. python | 网络编程(socket、udp、tcp)

    一.套接字 socket 1.1 作用:实现不同主机间的进程间通信(不同电脑.手机等设备之间收发数据) 1.2 分类:udp.tcp 1.3 创建 socket import socket socke ...