#include <iostream>
#include <vector>
using namespace std;
const long long NIE = 2000000000000000000LL;
long long p[1000010], r[1000010];
vector <long long> rp[1000010];
vector <long long> s[2000010];
long long mn[1000010];
long long sm[1000010];
long long policz(long long x, long long n, long long m) {
vector <long long> cykl;
long long suma = 0;
x = x % m;
cykl.push_back(x);
suma += r[x];
for(long long i = (x + n) % m; i != x; i = (i + n) % m) {
cykl.push_back(i);
suma += r[i];
}
long long sum2 = 2 * suma;
long long amn = 2000000, awm = -2000000, d = 1000000;
for(long long i = cykl.size() - 1; i >= 0; i --) {
sum2 -= r[cykl[i]];
s[sum2 + d].push_back(i + cykl.size());
amn = min(amn, sum2);
}
for(long long i = cykl.size() - 1; i >= 0; i --) {
sum2 -= r[cykl[i]];
amn = min(amn, sum2);
mn[i] = amn;
sm[i] = sum2;
s[sum2 + d].push_back(i);
}
long long w = NIE, aw, k;
for(long long i = 0; i < cykl.size(); i ++) {
for(long long j = 0; j < rp[cykl[i]].size(); j ++) {
long long y = rp[cykl[i]][j];
if(p[y] + mn[i] - sm[i] <= 0) {
aw = y + (s[sm[i] - p[y] + d].back() - i) * n - n + 1;
w = min(w, aw);
}
else if(suma < 0) {
k = (p[y] + mn[i] - sm[i] - 1) / (-1 * suma) + 1;
p[y] += k * suma;
aw = y + (s[sm[i] - p[y] + d].back() - i) * n + cykl.size() * n * k - n + 1;
w = min(w, aw);
}
p[y] = 0;
}
s[sm[i] + d].pop_back();
}
for(int i = amn; i <= awm; i ++) {
s[i].clear();
}
return w;
}
int main() {
ios_base::sync_with_stdio(0);
long long n, m;
char c;
cin >> n;
for(long long i = 0; i < n; i ++) {
cin >> p[i];
}
cin >> m;
for(long long i = 0; i < m; i ++) {
cin >> c;
if(c == 'W') {
r[i] = 1;
}
else {
r[i] = -1;
}
}
for(long long i = 0; i < n; i ++) {
rp[i % m].push_back(i);
}
long long wyn = NIE;
for(long long i = 0; i < n && p[i]; i ++) {\
wyn = min(wyn, policz(i, n, m));
}
if(wyn != NIE) {
cout << wyn;
}
else {
cout << -1;
}
cout << endl;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <vector> using namespace std; const long long NIE = 2000000000000000000LL; long long p[1000010], r[1000010]; vector <long long> rp[1000010]; vector <long long> s[2000010]; long long mn[1000010]; long long sm[1000010]; long long policz(long long x, long long n, long long m) { vector <long long> cykl; long long suma = 0; x = x % m; cykl.push_back(x); suma += r[x]; for(long long i = (x + n) % m; i != x; i = (i + n) % m) { cykl.push_back(i); suma += r[i]; } long long sum2 = 2 * suma; long long amn = 2000000, awm = -2000000, d = 1000000; for(long long i = cykl.size() - 1; i >= 0; i --) { sum2 -= r[cykl[i]]; s[sum2 + d].push_back(i + cykl.size()); amn = min(amn, sum2); } for(long long i = cykl.size() - 1; i >= 0; i --) { sum2 -= r[cykl[i]]; amn = min(amn, sum2); mn[i] = amn; sm[i] = sum2; s[sum2 + d].push_back(i); } long long w = NIE, aw, k; for(long long i = 0; i < cykl.size(); i ++) { for(long long j = 0; j < rp[cykl[i]].size(); j ++) { long long y = rp[cykl[i]][j]; if(p[y] + mn[i] - sm[i] <= 0) { aw = y + (s[sm[i] - p[y] + d].back() - i) * n - n + 1; w = min(w, aw); } else if(suma < 0) { k = (p[y] + mn[i] - sm[i] - 1) / (-1 * suma) + 1; p[y] += k * suma; aw = y + (s[sm[i] - p[y] + d].back() - i) * n + cykl.size() * n * k - n + 1; w = min(w, aw); } p[y] = 0; } s[sm[i] + d].pop_back(); } for(int i = amn; i <= awm; i ++) { s[i].clear(); } return w; } int main() { ios_base::sync_with_stdio(0); long long n, m; char c; cin >> n; for(long long i = 0; i < n; i ++) { cin >> p[i]; } cin >> m; for(long long i = 0; i < m; i ++) { cin >> c; if(c == 'W') { r[i] = 1; } else { r[i] = -1; } } for(long long i = 0; i < n; i ++) { rp[i % m].push_back(i); } long long wyn = NIE; for(long long i = 0; i < n && p[i]; i ++) {\ wyn = min(wyn, policz(i, n, m)); } if(wyn != NIE) { cout << wyn; } else { cout << -1; } cout << endl; } |
English