P4602 [CTSC2018]混合果汁

共有nnn种果汁,第iii种果汁的美味度为did_idi​,每升价格为pip_ipi​,在一瓶混合果汁中,最多只能添加lil_ili​升。

有mmm个询问,每次询问给出两个数g,Lg, Lg,L,我们要找出价格不大于ggg,体积不小于LLL的混合果汁的最大美味度。

混合果汁的美味度为所有参与混合的果汁的最小值,如果没有满足条件的混合果汁则输出−1-1−1。

把果汁按照美味度排一个序,对每个询问二分枚举did_idi​,然后judge[i,n][i, n][i,n]上的果汁是否可以混合得到满足要求,

当美味度最小值确定了,我们如何挑选果汁,不难想到,肯定是优先选价格更低的,然后次小的,依次类推,

我们按照美味值的相对顺序排序,然后以价格为下标建立主席树,这样我们就只要在[mid+1,n][mid + 1, n][mid+1,n]区间的主席树上去判断何不合法就行,

单次求解的复杂度是log⁡2n\log ^ 2 nlog2n的,感觉好像用不用整体二分效率应该是差不多的吧,整体复杂度都是Olog⁡2nO \log ^ 2 nOlog2n的。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10, maxn = 100000;int n, m, num, a[N], ans[N], root[N], ls[N << 5], rs[N << 5];long long sum[N << 5], cost[N << 5];struct Res {int d, p, l;void read() {scanf("%d %d %d", &d, &p, &l);}bool operator < (const Res &t) const {return d < t.d;}
}s[N];struct Ans {int id;long long g, l;
}q[N], q1[N], q2[N];void update(int &rt, int pre, int l, int r, int x, int v) {rt = ++num;ls[rt] = ls[pre], rs[rt] = rs[pre], sum[rt] = sum[pre] + v, cost[rt] = cost[pre] + 1ll * x * v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);}
}bool judge(int rt1, int rt2, int l, int r, long long pre_G, long long pre_L, long long G, long long L) {if (l == r) {if (pre_L + sum[rt2] - sum[rt1] < L) {return false;}return pre_G + (L - pre_L) * l <= G;}int mid = l + r >> 1;if (pre_L + sum[ls[rt2]] - sum[ls[rt1]] >= L) {return judge(ls[rt1], ls[rt2], l, mid, pre_G, pre_L, G, L);}else {pre_L += sum[ls[rt2]] - sum[ls[rt1]];pre_G += cost[ls[rt2]] - cost[ls[rt1]];return judge(rs[rt1], rs[rt2], mid + 1, r, pre_G, pre_L, G, L);}
}void solve(int l, int r, int L, int R) {if (l > r | L > R) {return ;}if (l == r) {for (int i = L; i <= R; i++) {ans[q[i].id] = l;}return ;}int mid = l + r >> 1, cnt1 = 0, cnt2 = 0;for (int i = L; i <= R; i++) {if (judge(root[mid], root[n], 1, maxn, 0, 0, q[i].g, q[i].l)) {q2[++cnt2] = q[i];}else {q1[++cnt1] = q[i];}}for (int i = 1; i <= cnt1; i++) {q[L + i - 1] = q1[i];}for (int i = 1; i <= cnt2; i++) {q[L + cnt1 + i - 1] = q2[i];}solve(l, mid, L, L + cnt1 - 1), solve(mid + 1, r, L + cnt1, R);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);a[1] = -1;for (int i = 2; i <= n + 1; i++) {s[i].read();a[i] = s[i].d;}n++;sort(a + 1, a + 1 + n);sort(s + 1, s + 1 + n);for (int i = 2; i <= n; i++) {update(root[i], root[i - 1], 1, maxn, s[i].p, s[i].l);}for (int i = 1; i <= m; i++) {long long g, l;scanf("%lld %lld", &g, &l);q[i] = {i, g, l};}solve(1, n, 1, m);for (int i = 1; i <= m; i++) {printf("%d\n", a[ans[i]]);}return 0;
}

P4602 [CTSC2018]混合果汁(主席树)相关推荐

  1. BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案

    题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...

  2. [CTSC2018]混合果汁 二分 套 主席树上二分

    题意: n种果汁,第iii种果汁的美味程度是did_idi​有lil_ili​​升,价格是pip_ipi​升 mmm个询问,要求使用果汁的总量不小于LimLimLim,价格不超过GGG,最大化所用的果 ...

  3. [Bzoj]5343: [Ctsc2018]混合果汁

    5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...

  4. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  5. P3168 [CQOI2015]任务查询系统 差分+主席树

    链接在这~:https://www.luogu.org/problem/P3168 主席静态区间修改,单点查询 区间(L,R)加1可以通过差分以后转换为L位置加1,R+1位置减1 我们只需要记录一下, ...

  6. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  7. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

  8. R19436221 区间第k小 主席树

    主席树模板题,记录一下. #include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; int root[maxn] ...

  9. LuoguP2617 Dynamic Rankings (动态主席树学习理解)

    题目地址 题目链接 题解 动态主席树的板子题.动态主席树其实和静态的有很大差别,虽然同样是n个根,但是节点并不能共用,每个根节点表示bit上的一段区间. 所以其实是个树套树的东西来着,外层是bit,内 ...

最新文章

  1. mysql临时开启二进制_关于MySQL二进制日志Binlog的认识
  2. iOS开发 最近开发了蓝牙模块,在此记录总结一下
  3. 知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践
  4. linux 查看 内存 占用,Linux终端:用smem查看内存占用情况
  5. 关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法
  6. js函数嵌套调用,无法获取函数返回值
  7. abs 不会整数 方法 溢出_asp cint clng的范围与防止cint和clng的溢出解决方法大全
  8. 致敬逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
  9. latex标记html样式,latex标题字体大小和样式
  10. 【Microsoft Azure 的1024种玩法】七.Azure云端搭建部署属于自己的维基百科
  11. 服务器远程协助能够禁用吗,如何使用组策略禁用/启用远程连接管理远程协助...
  12. 从不确定性中寻找“确定性”——一位交管从业者对行业发展趋势的思考
  13. 自定义ckeditor图片上传插件
  14. TreeGrid(树形表格)
  15. 给0~1岁的新媒体人:公众号怎么配图?免费图片哪里找?
  16. 计算机漫游用户的工作原理,漫游用户配置文件全攻略
  17. 护眼台灯哪种光源好?光源最舒适的护眼台灯推荐
  18. Matlab | 省略号作用
  19. Chrome浏览器怎么调试网页标题字体大小和颜色?
  20. Java利用TCP进行文件的传输

热门文章

  1. 怎样连接mysql文件_如何连接MYSQL数据库?
  2. 动点移动轨迹,猜猜这是曲线还是直线?
  3. 美女晕倒怎么办?二哈:这不是一滋就醒......
  4. 亲一下就搞定的事,绝不花钱解决!
  5. 怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。
  6. 宝宝学数学的第一套书,秒杀题海战术!上小学前应该这样学数学!
  7. 我是怎么进入Oracle这样的大企业的?
  8. php 电梯程序设计,教你写出京东电梯式轮播
  9. html的标签和标记有啥区别,HTML 元素 b 和 strong 有什么区别?//(强调标签的理解)...
  10. php 实现类,php 获取页面中指定内容的实现类