P8067 题解
songhongyi · · 题解
随机题目启动。
设
先解决第一问。一次操作会将区间内全部变为右端点的值,则操作
对于固定的
转化为:
即:
这是一个斜率优化的形式。可以考虑
将序列翻转后再跑一遍第一问得到的结果就是第二问。
时间复杂度
代码放一小段:
deque< int > q;
void solve()
{
q.clear();
for ( int i = 1; i <= n; i++ )
{
s[ i ] = s[ i - 1 ] + a[ i ];
}
q.push_back( 1 );
int ans = -0x3f3f3f3f3f3f3f3f;
for ( int i = 2; i <= n; i++ )
{
int p = q.front();
int l = 1, r = q.size() - 1;
while ( l <= r )
{
int mid = ( l + r ) / 2;
if ( slope( q[ mid - 1 ], q[ mid ] ) >= a[ i ] )
{
p = q[ mid ];
l = mid + 1;
}
else
{
r = mid - 1;
}
}
ans = max( ans, s[ n ] + a[ i ] * ( i - p + 1 ) - ( s[ i ] - s[ p - 1 ] ) );
while ( q.size() >= 2 and slope( q[ q.size() - 1 ], q[ q.size() - 2 ] ) <= slope( q[ q.size() - 1 ], i ) )
{
q.pop_back();
}
q.push_back( i );
}
cout << ans << endl;
}