#include <bits/stdc++.h> using namespace std; typedef long long LL; const int MX = 2e6 + 5; const int LOG = 10; const LL INF = 1e18 + 5; LL sum[LOG+2][MX], mn[LOG+2][MX], a[MX], n, m, pot2[LOG+2]; char t[MX]; LL Result = INF; int main() { scanf("%lld", &n); for (int i = 1; i <= n; ++ i) scanf("%lld", &a[i]); scanf("%lld%s", &m, t); pot2[0] = 1LL; for (int i = 1; i <= LOG; ++ i) pot2[i] = (pot2[i-1] * 2LL) % m; for (int i = 0; i < m; ++ i) sum[0][i] = (t[i] == 'W' ? 1 : -1); for (int j = 1; j <= LOG; ++ j) { LL pos2 = (0 + (1LL << (j-1))) % m; for (int i = 0; i < m; ++ i) { sum[j][i] = sum[j-1][pos2]; sum[j][i] += sum[j-1][i]; pos2++; pos2%=m; } } for (int i = 0; i < m; ++ i) mn[0][i] = sum[0][i]; for (int j = 1; j <= LOG; ++ j) { LL pos2 = (0 + (1LL << (j-1))) % m; for (int i = 0; i < m; ++ i) { mn[j][i] = min(mn[j-1][i], mn[j-1][pos2] + sum[j-1][i]); pos2 ++; pos2 %= m; } } // for (LL i = 0; i < m; ++ i){ // printf("Pozycja %lld na cyklu\n", i); // for (int j = 0; j <= LOG; ++ j) // printf("skok o 2 ^ %lld -- suma %lld -- min %lld\n", j, sum[j][i], mn[j][i]); // puts(""); // } int start = 0; for (int i = 1; i <= n; ++ i) { if (mn[LOG][start] > -a[i]) continue; // printf("Sprawdzam po ilu krokach odpadnie nr %d\n", i); LL akt_wsp = 0LL; LL aktPos = start; LL jakDaleko = 0LL; // printf("zaczyna w %d\n", start); while (mn[0][aktPos] + akt_wsp > -a[i]) { // printf("aktPos : %lld, akt_wsp : %lld\n", aktPos, akt_wsp); // // printf("daleko %lld\n", jakDaleko); for (int j = 1; j <= LOG; ++ j) if (mn[j][aktPos] + akt_wsp <= -a[i]) { // printf("PRZESUWAM O 1 << %d\n", j); akt_wsp += sum[j-1][aktPos]; jakDaleko += (1LL << (j-1)); aktPos = (aktPos + (n%m) * ((1LL << (j-1))%m)) % m; break; } } // printf("aktPos: %lld, akt_wsp: %lld, jakDaleko %lld\n", aktPos, akt_wsp, jakDaleko); Result = min(Result, (jakDaleko)*n + i); start ++; start %= m; } if (Result >= INF) puts("-1"); else printf("%lld\n", Result); return 0; }
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 94 95 96 97 98 99 100 101 102 103 104 105 | #include <bits/stdc++.h> using namespace std; typedef long long LL; const int MX = 2e6 + 5; const int LOG = 10; const LL INF = 1e18 + 5; LL sum[LOG+2][MX], mn[LOG+2][MX], a[MX], n, m, pot2[LOG+2]; char t[MX]; LL Result = INF; int main() { scanf("%lld", &n); for (int i = 1; i <= n; ++ i) scanf("%lld", &a[i]); scanf("%lld%s", &m, t); pot2[0] = 1LL; for (int i = 1; i <= LOG; ++ i) pot2[i] = (pot2[i-1] * 2LL) % m; for (int i = 0; i < m; ++ i) sum[0][i] = (t[i] == 'W' ? 1 : -1); for (int j = 1; j <= LOG; ++ j) { LL pos2 = (0 + (1LL << (j-1))) % m; for (int i = 0; i < m; ++ i) { sum[j][i] = sum[j-1][pos2]; sum[j][i] += sum[j-1][i]; pos2++; pos2%=m; } } for (int i = 0; i < m; ++ i) mn[0][i] = sum[0][i]; for (int j = 1; j <= LOG; ++ j) { LL pos2 = (0 + (1LL << (j-1))) % m; for (int i = 0; i < m; ++ i) { mn[j][i] = min(mn[j-1][i], mn[j-1][pos2] + sum[j-1][i]); pos2 ++; pos2 %= m; } } // for (LL i = 0; i < m; ++ i){ // printf("Pozycja %lld na cyklu\n", i); // for (int j = 0; j <= LOG; ++ j) // printf("skok o 2 ^ %lld -- suma %lld -- min %lld\n", j, sum[j][i], mn[j][i]); // puts(""); // } int start = 0; for (int i = 1; i <= n; ++ i) { if (mn[LOG][start] > -a[i]) continue; // printf("Sprawdzam po ilu krokach odpadnie nr %d\n", i); LL akt_wsp = 0LL; LL aktPos = start; LL jakDaleko = 0LL; // printf("zaczyna w %d\n", start); while (mn[0][aktPos] + akt_wsp > -a[i]) { // printf("aktPos : %lld, akt_wsp : %lld\n", aktPos, akt_wsp); // // printf("daleko %lld\n", jakDaleko); for (int j = 1; j <= LOG; ++ j) if (mn[j][aktPos] + akt_wsp <= -a[i]) { // printf("PRZESUWAM O 1 << %d\n", j); akt_wsp += sum[j-1][aktPos]; jakDaleko += (1LL << (j-1)); aktPos = (aktPos + (n%m) * ((1LL << (j-1))%m)) % m; break; } } // printf("aktPos: %lld, akt_wsp: %lld, jakDaleko %lld\n", aktPos, akt_wsp, jakDaleko); Result = min(Result, (jakDaleko)*n + i); start ++; start %= m; } if (Result >= INF) puts("-1"); else printf("%lld\n", Result); return 0; } |