首页 > 其他分享 >[Codeforces] CF1795C Tea Tasting

[Codeforces] CF1795C Tea Tasting

时间:2023-12-19 22:00:28浏览次数:37  
标签:Tasting int Tea ll CF1795C Codeforces Maxn ex

CF1795C Tea Tasting

题意

有 \(n\) 个人和 \(n\) 杯茶,第 \(i\) 个人每次会喝 \(b_i\) 毫升的茶。第 \(i\) 杯茶有 \(a_i\) 毫升。总共会喝 \(n\) 轮茶,第 \(j\) 轮第 \(i\) 个人会尝试喝第 \(i+1-j\) 杯茶。喝的量为 \(\min(a_{i+1-j},b_i)\) 毫升,并且使 \(a_{i+1-j}\) 减少 \(\min(a_{i+1-j},b_i)\) 。问 \(n\) 轮后每个人喝了多少毫升茶。

其中,如果\(i+1-j\leq 0\),那么第\(i\)个人停止品茶

思路

首先,每一个人能够喝到的茶都可以被表示为\(f_i\times b_i + ex_i\),其中\(f_i\)表示这个人完整和了一整杯茶的数量,\(ex_i\)则表示这个人遇到的不满的茶对其做的贡献

可以发现,每个茶\(a_i\)只能对\(j\geq i\)的\(b_j\)造成影响,而他能做的完整的贡献(即,对应轮数喝了\(a_i\))最大就是最大的\(k\)使得\(s_k-s_{i-1}\leq a_i\),令\(s\)为\(b\)数组的前缀和

所以,可以先求出\(s\),在对每一个\(a_i\)进行二分,找到最后一个能够进行完整贡献的数,并求出对应的\(f\)和\(ex\)即可,其中\(f\)可以用差分从\(O(n^2)\)优化到\(O(n)\)

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int Maxn=2e5+10;
int n;
ll a[Maxn],b[Maxn];
ll s[Maxn],f[Maxn],ex[Maxn];
void run()
{
	cin>>n;
	memset(f,0,sizeof(f));
	memset(ex,0,sizeof(f));
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++) s[i]=s[i-1]+b[i];
	for(int i=1;i<=n;i++)
	{
		if(s[n]-s[i-1]<=a[i])
		{
			f[i]++;
			continue;
		}
		int l=i,r=n,mid,ans;
		while(l<r)
		{
			mid=l+r>>1;
			if(s[mid]-s[i-1]<=a[i]) l=mid+1;
			else r=mid;
		}
		ans=l-1;
		f[i]++; f[ans+1]--;
		ex[ans+1]+=a[i]-(s[ans]-s[i-1]);
	}
	for(int i=1;i<=n;i++) f[i]+=f[i-1];
	for(int i=1;i<=n;i++) cout<<f[i]*b[i]+ex[i]<<" ";
	cout<<endl;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--) run();
	system("pause");
	return 0;
}

标签:Tasting,int,Tea,ll,CF1795C,Codeforces,Maxn,ex
From: https://www.cnblogs.com/lyk2010/p/17914907.html

相关文章

  • Educational Codeforces Round 160 (Rated for Div. 2) A~C
    A.RatingIncrease题意:将一个字符串分成两个整数a和b,要求没有前导0,且a<b思路:遍历字符串s,若当前位置不是0,则拆分字符串,比较大小//#include<bits/stdc++.h>#include<iostream>#include<string>#include<cstring>#include<vector>#include<algorithm>#inclu......
  • Educational Codeforces Round 160 (Rated for Div. 2)
    基本情况A题秒了。B题卡了实在太久,BC题最后虽然都过了,但是耗时太久。感觉C对我来说更好写。B.SwapandDelete经典+3。总是一条路偏要走到黑了才会想着换思路,早该换了。一开始想了一大堆乱七八糟的思路,但都错了。后面往简单了想,这题毕竟最后必须要左对齐的,直接从左往右比......
  • 【题解】CodeForces-1913
    CodeForces-1913ARatingIncrease依题意模拟。提交记录:Submission-CodeForcesCodeForces-1913BSwapandDelete交换免费就是能任意重排,从头开始尽量填相反的,剩下只能删去了。提交记录:Submission-CodeForcesCodeForces-1913CGamewithMultiset从大到小能减则减一定......
  • 【题解】CodeForces-1905
    CodeForces-1905AConstructiveProblems发现沿着对角线放就行了,答案是\(\max(n+m)\)。提交记录:Submission-CodeForcesCodeForces-1905BBegginer'sZelda最优操作每次删两个叶子(除了最后一次只剩两个节点),所以答案是叶子个数除以二上取整。提交记录:Submission-CodeForc......
  • Codeforces Round 834 (Div. 3)
    CodeforcesRound834(Div.3)A.Yes-Yes?题意:就是Y后面跟e,e后面跟s,s后面跟Y#include<iostream>usingnamespacestd;voidsolve(){stringx;cin>>x;intl=x.size();if(l==1){if(x[0]!='Y'&&x[0]!='e&#......
  • Codeforces Round 839 (Div. 3)
    CodeforcesRound839(Div.3)A.A+B?跳过太水了、、、、、#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){inta,b;scanf("%d+%d",&a,&b);cout<<a+......
  • Educational Codeforces Round 131 (Rated for Div. 2)
    基本情况AB秒了。C知道是二分答案,check死活写不出来。C.ScheduleManagementProblem-C-Codeforces错误分析这题比较绕,搞了一个对应关系,大脑转不过来。写check的时候完全想不出合理的思路。很明显的要用桶来计数,但是怎么用不知道了。看了题解后发现,check不能遍历任......
  • 无涯教程-Java - ByteArrayOutputStream函数
    ByteArrayOutputStream类流在内存中创建一个缓冲区,所有发送到该流的数据都存储在该缓冲区中。以下是ByteArrayOutputStream类将提供的构造函数的列表。Sr.No.Constructor&Remark1ByteArrayOutputStream()此构造函数创建一个具有32字节缓冲区的ByteArrayOutputStream。......
  • Educational Codeforces Round 159 (Rated for Div. 2)
    EducationalCodeforcesRound159(RatedforDiv.2)A-BinaryImbalance解题思路:有一对\((0,1)\),那么\(0\)就能无限增长。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+10;typedefpair<ll,ll>pii;constllm......
  • Codeforces Round 915 (Div. 2)
    基本情况A题还没进入状态,卡了快10分钟。B题一开始想复杂了,以为是树的直径,后面推出来发现针对叶子数目讨论就行了,正确思路出来太慢了(一个半小时)。C题留了半个多小时,随便口胡了一个LIS思路,但是判断无解没思路。C.LargestSubsequenceProblem-C-Codeforces首先我们把字......