CF1795C Tea Tasting (前缀和,差分,二分)
链接
题意:
有n种茶,n个人,第i种茶有 a[i]的量,第i个人一次能喝 b[i], 第i个人从第i种茶开始往前喝,求每个人能喝多少
分析
对于第 i 杯茶,其只会被 i,i+1,i+2,⋯,n 这些人品尝. 可以发现一定是第 i ∼ j个人可以品尝到 b_i∼b_j单位的茶,然后第 j+1个人可以品尝到第 i 杯茶剩下的所有部分,然后再后面的人就没有茶可以品尝了.
对于所有的茶 i ,我们容易通过二分找到 j 的位置,我们可以统计对于每个人k,其品尝到 /b_k 毫升茶多少次,我们发现每次我们都是做一个静态的区间加,可以用差分解决.而对于品尝到所有剩下的茶的情况可以直接暴力加到答案上.总复杂度为O(nlogn).
参考代码:
#include <bits/stdc++.h>using ll = long long;
const int maxn = 2e5 + 5;
int a[maxn], b[maxn];
ll s[maxn];
ll d[maxn], ans[maxn];int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int T;std::cin >> T;while (T--) {int n;std::cin >> n;for (int i = 1; i <= n; i++) {d[i] = ans[i] = 0;}for (int i = 1; i <= n; i++) {std::cin >> a[i];}for (int i = 1; i <= n; i++) {std::cin >> b[i], s[i] = s[i - 1] + b[i];// 求一下 b 数组的前缀和}for (int i = 1; i <= n; i++) {int r = std::upper_bound(s + 1, s + 1 + n, a[i] + s[i - 1]) - (s + 1);d[i]++, d[r + 1]--;if (r < n) {ans[r + 1] += a[i] - (s[r] - s[i - 1]);}}for (int i = 1; i <= n; i++) {d[i] += d[i - 1];ans[i] += d[i] * b[i];}for (int i = 1; i <= n; i++) {std::cout << ans[i] << " \n"[i == n];}}return 0;
}
方法二:
我们使用小根堆存储剩余的茶
假设当前剩余的情况是这样的 :
参考代码:
#include <bits/stdc++.h>using ll = long long;const int N = 1e6 + 10;int n;
ll a[N], b[N], ans[N];void solve() {std::cin >> n;for (int i = 1; i <= n; i++) {std::cin >> a[i];}for (int i = 1; i <= n; i++) {std::cin >> b[i], ans[i] = 0;}ll now = 0;std::priority_queue<ll, std::vector<ll>, std::greater<ll>> q;for (int i = 1; i <= n; i++) {q.push(a[i] + now);while (q.size()) {ll t = q.top();if (t - now > b[i]) {ans[i] += q.size() * b[i];break;} else {ans[i] += t - now, q.pop();}}now += b[i];}for (int i = 1; i <= n; i++) {std::cout << ans[i] << " \n"[i == n];}
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}
CF1795C Tea Tasting (前缀和,差分,二分)相关推荐
- 基础算法__习题——排序、二分、前缀与差分
前言 重学算法第1天,希望能坚持打卡不间断. 直到学完提高课.(暂定) 预计时长三个月内,明天再来!肝就完了 2月13日,day01 打卡 学完y总的算法基础课1.3-Week1 习题课 共7题,知识 ...
- 1795C Tea Tasting
1795C Tea Tasting 从 aia_iai 入手,找到 iii 号茶能支撑到哪一个人喝,然后将 iii 号茶所能供应的人通过差分进行修改 表示这个人能喝多少次 bib_ibi , 对于 ...
- 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分
A Boring Problem 题解 其实这题不难,只要想到了前缀和差分就基本OK了. 我们要求的是第iii项的式子: F(i)=(a1+a2+...+ai)k+(a2+...+ai)k+...+( ...
- 前缀和+差分+ 树状数组
前缀和+差分的理论知识 前缀和相关题: 「USACO16JAN」子共七 Subsequences Summing to Sevens 定理:若两个数相减 mod k == 0,那么这两个数mod k ...
- [多项式前缀和差分]智乃酱的静态数组维护问题多项式
[多项式前缀和差分]智乃酱的静态数组维护问题多项式 题目 思路 参考资料 基本定理是:最高次为n次的多项式最多做n+1阶差分 最板的题目是,区间加一个常数,我们一般对a数组做一次差分然后在a[l]和a ...
- 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...
- AtCoder Beginner Contest 205D题Kth Excluded(差分+二分)
题目链接 给出N个数和Q组询问,每次询问输出第K小的数,并且该数不能是N个数中的 考虑先做差分 pre[i] 表示每个数之间可以插入多少个数 然后将差分做个前缀和,sum[i]=k 表示前i个数可以放 ...
- C. Tea Tasting
传送门 题意: 有n种茶,n个人,第i种茶有 a[i]的量,第i个人一次能喝 b[i], 第i个人从第i种茶开始往前喝,求每个人最多能喝多少茶. 思路: 可以从后面往前面挪,用二分去寻找当前茶能有多 ...
- C. Tea Tasting codeforces 1795C
Problem - C - Codeforces 题目大意:有两个长度为n的数组a,b,每一轮操作,ai减去对应位置上的bi,最小减为0,然后删除b1,b数组所有元素都向左移,直到b数组中所有数都被删 ...
最新文章
- IIRF重写在asp.net4.0+IIS6中部分失败的解决方案
- 【学时总结模板时间】◆学时·10 模板·3◆ AC自动机
- 踩坑 - click事件与blur事件冲突问题 input文件上传同名文件问题
- python基础版课件_python基础课件精编版.ppt
- c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)
- java为什么要分为service层,dao层,controller层
- ListView setOnItemClickListener无法响应点击事件解决
- Axure使用教程(一)、下载和基本使用
- Django搭建个人博客之制作app并配置相关环境
- 读取TXT文档数据生成词云图
- DEL: 华为无线modem变无线路由器
- MBA提前面试:商学院看重软实力
- 【工具神器】PO VO DTO 转换神器
- 面向汽车企业的PLM知识管理
- MySQL错误:Can't create table‘..’ (errno:150)解决方案
- stm32F407 连接 对射式红外对管 样例
- 没有网能使用mysql吗_就用本地数据库;即使在没有联网的电脑上也可以放心使用...
- ASEMI整流模块MDA110-16参数,MDA110-16规格
- ajax请求type种类,ajax配置项中的type与method
- 将XDOC引擎加入你的J2EE应用中
热门文章
- 计算机考研难度特别大吗,计算机考研难度大吗?学姐为你深度剖析
- Python超市管理系统 毕业设计-附源码111042
- 知识付费项目备受质疑究竟是什么原因?“贩卖焦虑““割韭菜”?通通不是!
- Android RecyclerView不显示
- 数据单位---bit 与 byte
- HDU 4986/BC 7B Little Pony and Alohomora Part I
- Linux添加 PYTHONPATH 环境变量的3种方法
- OpenCV学习代码记录——轮廓(contour)检测
- ExtJs 树的右击菜
- 氮化物 ITO-Ag复合薄膜/Si—P(111)和Si—P(100)两种不同Si片做基底制备TiNx薄膜/立方氮化硼聚晶(PcBN)复合物