题解:P15906 [TOPC 2024] Business Magic
_Sorasaki_Hina_ · · 题解
我们实际上关心的是
由于绿魔法没有限制,所以我们会有一个“初始价值”
- 若
r_i >= 0 ,使用绿魔法为r_i ,蓝魔法为2r_i ,可以带来2r_i - r_i = r_i 的贡献。 - 若
r_i < 0 ,使用绿魔法为-r_i ,蓝魔法为2r_i ,可以带来2r_i - (-r_i) = 3r_i 的贡献。(注意3r_i < 0 。)
我们希望多带来的贡献最大化,且选的
设
注意若
答案为
注意 long long。复杂度
#include<iostream>
#include<utility>
#include<cstdio>
#include<algorithm>
#define re register
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define db double
#define fi const int&
#define fl const ll&
#define ful const ull&
#define fc const char&
#define fs const string&
#define debug() puts("I Love Hina Forever")
using namespace std ;
namespace IO {
template<class T>inline void read(T &x){char c=getchar(),f=false;x=0;while(c<48||c>57) {f|=(c==45),c=getchar();}while(c>=48&&c<=57){x=(x<<3)+(x<<1)+(c^48),c=getchar();}if(f){x=~x+1;}}
template<class T,class ...Arg>inline void read(T &x,Arg &...arg){read(x),read(arg...);}
template<class T>inline void write(T x){if(x<0){putchar(45),x=~x+1;}if(x>9){write(x/10);}putchar(x%10|48);}
template<class T>inline void write(T x,fc c){write(x),putchar(c);}
}using namespace IO ;
const int N = 3e5 + 5 ;
int n ;
ll f,maxx,ans,sum,a[N] ;
int main () {
read(n) ;
for (re int i = 1 ; i <= n ; ++i) read(a[i]) ;
for (re int i = 1 ; i <= n ; ++i) {
sum += a[i] >= 0 ? a[i] : -a[i] ;
a[i] = a[i] >= 0 ? a[i] : 3 * a[i] ;
}
for (re int i = 1 ; i <= n ; ++i) f = max(f,0ll) + a[i],maxx = max(maxx,f) ;
write(sum + maxx) ;
return 0 ;
}