1. 程式人生 > >Codeforces 660F Bear and Bowling 4 斜率優化 (看題解)

Codeforces 660F Bear and Bowling 4 斜率優化 (看題解)

ons alc class size for span lin eps cal

Bear and Bowling 4

這也能斜率優化。。。

max[ i ] = a[ i ] - a[ j ] - j * (sum[ i ] - sum[ j ])然後就能斜率優化啦, 我咋沒想到, 我好菜啊。

斜率優化最重要的是轉換成前綴形式, 我TM又忘了。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define
PII pair<int, int> #define SZ(x) ((int)x.size()) #define ull unsigned long long using namespace std; const int N = 2e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-6; const double PI = acos(-1); int n, que[N], be = 1
, ed = 0; LL val[N], a[N], sum[N], ans; long double calc(int k, int j) { return ((a[j] - (long double)j * sum[j]) - (a[k] - (long double)k * sum[k])) / (j - k); } int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%lld", &val[i]); a[i]
= a[i - 1] + i * val[i]; sum[i] = sum[i - 1] + val[i]; ans = max(ans, a[i]); } que[++ed] = 1; for(int i = 2; i <= n; i++) { int low = be, high = ed - 1, p = -1; while(low <= high) { int mid = low + high >> 1; if(calc(que[mid], que[mid + 1]) < -sum[i]) p = mid, low = mid + 1; else high = mid - 1; } int j = (p == -1) ? que[be] : que[p + 1]; ans = max(ans, a[i] -a[j] - j * (sum[i] - sum[j])); while(ed > be && calc(que[ed-1], que[ed]) > calc(que[ed], i)) ed--; que[++ed] = i; } printf("%lld\n", ans); return 0; } /* */

Codeforces 660F Bear and Bowling 4 斜率優化 (看題解)