https://codeforces.com/contest/1795/problem/C

用二分+前缀和+差分卡过

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int t;
int n;
long long a[N],b[N],s[N],res[N],num[N];
void fact(int x,int l,int r){
num[l]++;
int k=l-1;
while(l<r){
int mid=l+r>>1;
if(s[mid]-s[k]<x) l=mid+1;
else r=mid;
}
if(s[l]-s[k]<=x) num[l+1]--;
else num[l]--,res[l]+=x-(s[l-1]-s[k]);//这里第l个人没有喝满
}
int main(){
cin>>t;
while(t--){
cin>>n;
memset(num,0,sizeof num);//注意归零
memset(res,0,sizeof res);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
cin>>b[i];
s[i]=s[i-1]+b[i];
}
for(int i=1;i<=n;i++){
fact(a[i],i,n);
}
for(int i=1;i<=n;i++){
num[i]+=num[i-1];
res[i]+=num[i]*b[i];
cout<<res[i]<<" ";
}
cout<<endl;
}
}
/*
题目大意就是给定n杯茶多少毫升和n个人能喝多少毫升,一开始第i个人在喝第i杯茶
每喝完一次,他们就要向前走去喝第i-1杯茶,喝完为止,第一个人往前走就直接去除
思路就是对于前缀和和差分和二分
对于第i杯茶,找到第i~j这段和恰好大于a[i],然后第i个人的喝茶数就加一
对于第j个人需要特判3种情况
只需二分查找和,并记录每个人的喝茶数量,以及加上喝了不到最大喝茶量的茶
就是答案
*/

最新文章

  1. 可爱的豆子——使用Beans思想让Python代码更易维护
  2. xmind的第十三天笔记
  3. windows 7 右下角登陆信息去除
  4. 二进制打印与逆序_C语言(转)
  5. artTemplate 介绍
  6. UltraEdit常用配置&amp;搭建Java/C开发环境
  7. Mysql中自增字段(AUTO_INCREMENT)的一些常识
  8. jQuery Mobile里xxx怎么用呀?(缓存篇)
  9. [原]RobotFrameWork(四)变量运算与Evaluate
  10. C++设计模式---职责链模式
  11. TWRP-recovery中文界面安装方法[转]
  12. switch语句:适用于一个条件有多个分支的情况---分支语句
  13. Chrome调试工具developer tool技巧
  14. 客户地点分配多OU
  15. pwnable.kr input解题记录
  16. form表单的三个属性 action 、mothod 、 enctype。
  17. Mybatis 学习总结
  18. Yarn的资源隔离机制
  19. 网络Socket编程UDP协议例子
  20. docker学习(一)在centos7上安装与启动docker

热门文章

  1. Vue ElementUI 修改MessageBox 弹框样式
  2. (23)go-micro微服务客户端开发(使用负载均衡)
  3. 读Java8函数式编程笔记06_Lambda表达式编写并发程序
  4. Linux环境下:程序的链接, 装载和库[ELF文件详解]
  5. SpringBoot Test Junit 联用
  6. 什么是Http? http和https的区别
  7. https://lamp.sh/
  8. HTML5----响应式(自适应)网页设计(自动适应屏幕大小)
  9. CCRD_TOC_2008年第4期
  10. Linux(CentOS)安装MinIo,详细教程,附防火墙端口开放操作