Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98195 | CSYZChenQX | 早凉与序列4 | C++ | 运行出错 | 0 | 51 MS | 56388 KB | 2451 | 2023-08-14 12:27:06 |
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MX = 2e5 + 5; int n, k, len, lg[MX]; ll x; ll w[MX], c[MX], mul[18], st1[18][MX], st2[18][MX]; void ST() { for(int i=1; i<=17; i++) for(int x=1; x<=n-mul[i]; x++) st1[i][x] = min(st1[i-1][x], st1[i-1][x+mul[i-1]]), st2[i][x] = min(st2[i-1][x], st2[i-1][x+mul[i-1]]); } ll mx1(int l, int r) { int k = lg[r-l+1]; return min(st1[k][l], st1[k][r-mul[k]+1]); } ll mx2(int l, int r) { int k = lg[r-l+1]; return min(st2[k][l], st2[k][r-mul[k]+1]); } int main() { cin>>n>>k>>x; for(int i=1; i<=n; i++) { scanf("%lld", &w[i]); c[i] = w[i]+c[i-1]; } mul[0] = 1; for(int i=1; i<=17; i++) mul[i] = mul[i-1]*2; lg[1] = 0; for(int i=2; i<=n; i++) lg[i] = lg[i>>1]+1; for(int i=1; i<=n; i++) st1[0][i] = c[i] + i*x, st2[0][i] = c[i]-i*x; ST(); ll ans; int x1, x2; if(x>=0) { for(int i=1; i<=n; i++) { x1 = mx1(i-k, i); ans = max(ans, st1[0][i]-x1); x2 = mx2(1, i-k); ans = max(ans, st1[0][i]-x1+st2[0][i-k]-x2); } } else { for(int i=1; i<=n; i++) { int p = max(1, k-n+i); x1 = mx2(p, i); ans = max(ans, st2[0][i]-x1); x2 = mx1(1, p); ans = max(ans, st2[0][i]-x1+st1[0][p]-x2); } } cout<<ans<<endl; return 0; } // #include<bits/stdc++.h> // using namespace std; // typedef long long ll; // const int MX = 2e5 + 5; // int n, k; // ll x, ans; // ll w[MX], c[MX]; // queue<int> q1, q2; // int main() // { // scanf("%d%d%lld", &n, &k, &x); // for(int i=1; i<=n; i++) // { // scanf("%lld", &w[i]); // c[i] = w[i]+c[i-1]; // } // if(k>=0) // { // int x1,x2; // q1.push(0), q2.push(0); // for(int i=1; i<=n; i++) // { // cout<<i<<endl; // while(q1.size()&&(q1.front()>=c[i]+i*x||q1.front())) q1.pop(); q1.push(c[i]+i*x); // while(q2.size()&&(q2.front()>=c[i]-i*x||)) q2.pop(); q2.push(c[i]-i*x); // x1 = q1.front(); q1.pop(); // x2 = q2.front(); q2.pop(); // cout<<x1<<" "<<x2<<endl; // ans = max(ans, c[i]+i*x-x1); ans = max(ans, 2*c[i]-x1-x2); // } // } // cout<<ans<<endl; // return 0; // }