题目
思路
每次记录1~n这个区间最大的利益和,每次加上这个区间的最大利益和*人数就好了!
代码
#include <bits/stdc++.h>
using namespace std;
inline __int128 read(){
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void print(__int128 x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
print(x/10);
putchar(x%10+'0');
}
__int128 a[100100],b[100010],sum[100010],maxn[100010];
int main(){
// ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
int cnt=0;
while(t--){
int n;
cnt++;
cin>>n;
__int128 res=0;
sum[0]=0;
maxn[0]=-(1e9+7);
for(int i=1;i<=n;i++){
a[i]=read();
sum[i]=sum[i-1]+a[i];
maxn[i]=max(maxn[i-1],sum[i]);
}
b[0]=0;
for(int i=1;i<=n;i++){
b[i]=read();
if(i>=2) b[i]=min(b[i-1],b[i]);
}
__int128 pre=maxn[n],bmax=0,temp=0;
bool flag=1;
// for(int i=1;i<=n;i++) print(maxn[i]),cout<<endl;
for(int i=n;i>=1;i--){
//print(maxn[i]);
if(maxn[i]==pre){
if(maxn[i]==sum[i]) bmax=max(b[i],bmax);
flag=0;
}
else{
flag=1;
pre=maxn[i];
res+=(bmax-temp)*maxn[i+1];
// print(res);
temp=bmax;
if(maxn[i]==sum[i]) bmax=b[i];
}
}
res+=(bmax-temp)*maxn[1];
cout<<"Case #"<<cnt<<": ";
print(b[1]);
cout<<" ";
print(res);
cout<<endl;
}
return 0;
}