SSL2834 2017年11月4日提高组T2 背包(二分)
2017-11-05 19:38
344 查看
2017年11月4日提高组T2 背包
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
Hint
【数据规模和约定】
20%的数据,n,m<=1000。
100%的数据,n,m<=100000,ai,bi,cj<=10^12。
分析:每次二分一下当前能买的价值最高的物品,然后再二分一下能买的连续一段的长度。由于每次买走一段以后钱至少减少一半,因此每个人只会二分 log 次。
代码
#include <cstdio> #include <algorithm> #define N 100005 #define ll long long using namespace std; struct arr { ll x,y; }a ; ll p ,sumx ,sumy ,n,m; int so(arr u,arr v) { if (u.x==v.x) return u.y>v.y; return u.x>v.x; } int find(int o,ll sump) { int l=o,r=n; while (l<r) { int mid=(l+r)/2; ll sum=sumx[mid]-sumx[o-1]; if (sum<=sump) l=mid+1; else r=mid; } if (sumx[l]-sumx[o-1]>sump) l--; return l; } int main() { //freopen("pack.in","r",stdin); //freopen("pack.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y); for (int i=1;i<=m;i++) scanf("%lld",&p[i]); sort(a+1,a+n+1,so); for (int i=1;i<=n;i++) { sumx[i]=sumx[i-1]+a[i].x; sumy[i]=sumy[i-1]+a[i].y; } for (int i=1;i<=m;i++) { ll ans=0; int s=0; while (p[i]>=a .x) { int l=s+1,r=n+1; while (l<r) { int mid=(l+r)/2; if (a[mid].x>p[i]) l=mid+1; else r=mid; } s=find(l,p[i]); p[i]-=sumx[s]-sumx[l-1]; ans+=sumy[s]-sumy[l-1]; if (s==n) break; } printf("%lld\n",ans); } fclose(stdin); fclose(stdout); }
相关文章推荐
- SSL2835 2017年11月4日提高组T2 字典序(堆+拓扑序)
- 2017年11月4日提高组T1 背包
- SSL2703 2017年8月16日提高组T2 疾病(dfs)
- SSL2777 2017年10月21日提高组 偷懒的西西(二分+dp)
- 2017年11月4日提高组T2 字典序
- SSL2731 2017年9月16日提高组T2 学校联网(kruskal)
- SSL2706 2017年8月17日提高组T2 考试(贪心)
- 2016年提高组模拟题(20161114) 物品选取 ssl 2572 dp_背包
- SSL2454 NOIP2015提高组模拟题八 采药(背包dp)
- SSL2810 2017年10月30日提高组T2 数论(math)
- SSL2795 2017年10月26日提高组T2 幸运值(组合)
- SSL2812 2017年10月30日提高组T2 凤凰院凶真(dp,LCIS)
- SSL2845 2017年11月8日提高组T2 序列操作(贪心,树状数组,差分)
- SSL2843 2017年11月8日提高组T2 拆网线(树形dp)
- SSL2672 2017年8月8日提高组T3 题目(二分+spfa)
- SSL2688 2017年8月14日提高组T2 温度
- SSL2832 2017年11月3日提高组T1 生日宴会(二分)
- SSL2844 2017年11月8日提高组T2 奇怪的队列(线段树贪心)
- SSL2759 2017年10月6日提高组T2 挖矿(dp)
- SSL2674 2017年8月9日提高组T2 覆盖(dp)