Description

蛤布斯有n种商品,第i种物品的价格为ai,价值为bi。有m个人来向蛤布斯购买商品,每个人每种物品只能购买一个。第j个人有cj的钱,他会不停选择一个能买得起的价格最高的商品买走(如果有多个则选择价值最高的)。你需要求出每个人购买的物品的价值和。

Input

第一行两个正整数n,m。接下来n行每行两个正整数ai,bi。接下来m行每行一个正整数cj。

Output

m行,每行一个整数表示答案。

Sample Input

5 4
10 5
9 8
7 3
3 4
1 2
20
100
28
18

Sample Output

15
22
18
10

Data Constraint

20%的数据,n,m<=1000。
30%的数据,ai,bi,cj在[1,10^12]中均匀随机。
100%的数据,n,m<=100000,ai,bi,cj<=10^12。

Solution

  • 首先按价格从大到小排一遍序。

  • 考虑跳着跳着走,每次先二分出能卖的最大价格的物品的位置,走过去、

  • 之后二分出能卖的一段物品(用前缀和记录),减钱并购买之,跳到那一段的末尾。

  • 之后再重复第一步,不断地一段一段走即可。

  • 这样的时间复杂度为 O(M log2N)O(M\ log^2N) 。

  • 因为一个人的钱数每次至少减少一半(价格从大到小,不然就还能再买),

  • 这样就最多二分 loglog 次,复杂度得证。

Code

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+2;
struct data
{long long x,y;
}a[N];
long long f[N],g[N];
inline long long read()
{long long X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void write(long long x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline bool cmp(data x,data y)
{return x.x>y.x || x.x==y.x && x.y>y.y;
}
int main()
{int n=read(),m=read();for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++) f[i]=f[i-1]+a[i].x,g[i]=g[i-1]+a[i].y;while(m--){long long c=read(),ans=0;if(c>=f[n]){write(g[n]),putchar('\n');continue;}for(int i=1;i<=n;i++){int l=i,r=n,pos=0;if(a[i].x>c){while(l<r){int mid=(l+r)>>1;if(a[mid].x>c) l=mid+1; else r=mid;}if(a[l].x>c) break;i=l;}pos=l=i,r=n;while(l<r){int mid=(l+r)>>1;if(f[mid]-f[i-1]<=c) l=mid+1,pos=mid; else r=mid;}c-=f[pos]-f[i-1];ans+=g[pos]-g[i-1];i=pos;}write(ans),putchar('\n');}return 0;
}

JZOJ 5440. 【NOIP2017提高A组冲刺11.1】背包相关推荐

  1. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  2. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  3. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  5. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

  6. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章

    Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...

  7. JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书

    Description Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置. P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共 ...

  8. JZOJ 5460. 【NOIP2017提高A组冲刺11.7】士兵训练

    Description Input 第一行两个数n,q 表示士兵数以及阅兵次数. 接下来一行n-1 个整数,第i 个整数表示士兵i+1 的直属教官. 接下来n 行每行两个整数i i b ,l 描述一位 ...

  9. JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

最新文章

  1. SQLPLUS SPOOL命令使用详解
  2. Intellij idea快速查看Java类字节码
  3. Docker容器的迁移
  4. WindowsServer2008防火墙配置命令
  5. 线性时变系统能用模型预测控制吗_线性系统理论(二)运动分析
  6. LeetCode 885. 螺旋矩阵 III
  7. 用Python一键生成炫酷九宫格图片,火了朋友圈
  8. 是时候详细探究webview了
  9. SQLite数据操作
  10. 字节跳动架构师讲解Java开发!dockerstop命令
  11. 以拯救之因 强制恢复导致ORA-600 4000错误案例
  12. 会计学硕和计算机,会计学与会计硕士有什么区别
  13. 如何使用js判断视频是否可以成功访问
  14. 修复升级ndk到17.0.4754217编译so失败问题
  15. 保研夏令营面试、考研复试自我介绍、个人展示模板与撰写注意事项
  16. 关于Stream流的使用
  17. 微信小程序 java校友录交流系统springboot
  18. Activity onDestroy() 回调缓慢问题分析及完美解决方案
  19. 智能制造并非只是自动化
  20. org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。 的解决办法

热门文章

  1. c++学习笔记之成员函数
  2. AD,proteus操作
  3. Python中if __name__ == '__main__':作用
  4. 运行iDT算法代码及后续特征编码
  5. USTC小道消息20220119
  6. [快速入门MATLAB]MATLAB常见问题及解答汇总
  7. 3 个相见恨晚的 Google Colaboratory 奇技淫巧!
  8. axios 登录后设置header_axios如何利用promise无痛刷新token
  9. log4net在winform中release后不工作的原因
  10. sqlserver查看跟某个表相关的所有存储过程