'#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
const int N = 2e6 + 10;
#define int long long
int n;
string s;
int k, w, q;
int a[N], m;
int findl (int tar, int i) {
int l = 1, r = i;
while (l < r) {
int mid = l + r + 1 >> 1;
if (a[mid] <= tar) l = mid;
else r = mid - 1;
}
return l;
}
int findr (int tar, int i) {
int l = i, r = m;
while (l < r) {
int mid = l + r>> 1;
if (a[mid] >= tar) r = mid;
else l = mid + 1;
}
return l;
}
void solve() {
scanf("%d", & n);
cin >> s;
cin >> k >> w >> q;
for (int i = 0; i < n; i ++) {
if (s[i] == '1') continue;
a[++m] = i + 1;
}
int ans = 0;
for (int i = 1; i <= m; i ++) {
int l = findl(a[i] - k, i);
int r = findr(a[i] + k, i);
int aa = 0, bb = 0;
if (l != i)
aa= w - abs(k - abs(a[i] - a[l])) * q;
if (l + 1 != i && l + 1 < i) {
aa = max (aa, w - abs(k - abs(a[i] - a[l + 1])) * q);
}
if (r != i)
bb= w - abs(k - abs(a[i] - a[r])) * q;
if (r - 1 != i && r - 1 > i) {
bb = max (bb, w - abs(k - abs(a[i] - a[r - 1])) * q);
}
ans = max (ans, aa + bb);
}
cout << ans << endl;
}
signed main () {
solve();
}'
这题并不难,但是我在想到做法的时候,以为实现难度会很高,就放弃了。这是不行的,我们应该尽量让问题简单一点