//Przemysław Jakub Kozłowski #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #define FI first #define SE second #define MP make_pair using namespace std; typedef long long LL; const int N = 1000006, M = 1000006, INF = 1000000009; const LL LINF = 1000000000000000018; inline int dzsuf(int a, int b) {return (a+b-1)/b;} int n,m; int A[N]; char B[M]; int zaw[M]; int pelne[M]; int tab_[6*M+15]; int tab_ind, tab_war; int *tab = tab_+3*M+7; int main() { scanf("%d", &n); for(int i = 1;i <= n;i++) scanf("%d", &A[i]); scanf("%d", &m); scanf(" "); for(int i = 1;i <= m;i++) { char c = getchar_unlocked(); B[i] = (c == 'P' ? -1 : 1); } A[n+1] = INF; for(int i = 1;i <= m;i++) zaw[i] = n+1; for(int i = 1;i <= n;i++) if(A[zaw[(i-1)%m+1]] > A[i]) zaw[(i-1)%m+1] = i; pair<LL, int> wyn = MP(LINF, INF); int cykle = __gcd(n, m); for(int cnr = 1;cnr <= cykle;cnr++) { vector<int> tcykl; for(int p = cnr;;) { tcykl.push_back(p); p = (p+n-1)%m+1; if(p == cnr) break; } tab_ind = 0; tab_war = 0; for(int i = -((int)tcykl.size()+5);i <= (int)tcykl.size()+5;i++) tab[i] = INF; int suma = 0, minimum = 0; tab[0] = 0; for(int i = 0;i < tcykl.size();i++) { suma += B[tcykl[i]]; minimum = min(minimum, suma); tab[suma] = min(tab[suma], i+1); } for(int i = tcykl.size()-1;i >= 0;i--) { char znak = B[tcykl[i]]; tab_war++; tab_ind += znak; tab[0-tab_ind] = 0-tab_war; if(tab[(minimum-1)-tab_ind]+tab_war <= tcykl.size()) minimum = minimum-1; else if(tab[minimum-tab_ind]+tab_war <= tcykl.size()) minimum = minimum; else minimum = minimum+1; int poczatkowe = A[zaw[tcykl[i]]]; int pelne = -1; if(poczatkowe <= (-minimum)) pelne = 0; else if(suma < 0) pelne = dzsuf(max(0,poczatkowe-(-minimum)), -suma); if(pelne >= 0) { int zostanie = poczatkowe-pelne*(-suma); //cerr << "Zostanie: " << zostanie << endl; int dodatkowo = tab[(-zostanie)-tab_ind]+tab_war; LL twyn = (LL)pelne*tcykl.size()+dodatkowo; wyn = min(wyn, MP(twyn, zaw[tcykl[i]])); } } } if(wyn.FI == LINF) printf("-1\n"); else { LL Kwyn = (wyn.FI-1)*n+wyn.SE; printf("%lld\n", Kwyn); } 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 | //Przemysław Jakub Kozłowski #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #define FI first #define SE second #define MP make_pair using namespace std; typedef long long LL; const int N = 1000006, M = 1000006, INF = 1000000009; const LL LINF = 1000000000000000018; inline int dzsuf(int a, int b) {return (a+b-1)/b;} int n,m; int A[N]; char B[M]; int zaw[M]; int pelne[M]; int tab_[6*M+15]; int tab_ind, tab_war; int *tab = tab_+3*M+7; int main() { scanf("%d", &n); for(int i = 1;i <= n;i++) scanf("%d", &A[i]); scanf("%d", &m); scanf(" "); for(int i = 1;i <= m;i++) { char c = getchar_unlocked(); B[i] = (c == 'P' ? -1 : 1); } A[n+1] = INF; for(int i = 1;i <= m;i++) zaw[i] = n+1; for(int i = 1;i <= n;i++) if(A[zaw[(i-1)%m+1]] > A[i]) zaw[(i-1)%m+1] = i; pair<LL, int> wyn = MP(LINF, INF); int cykle = __gcd(n, m); for(int cnr = 1;cnr <= cykle;cnr++) { vector<int> tcykl; for(int p = cnr;;) { tcykl.push_back(p); p = (p+n-1)%m+1; if(p == cnr) break; } tab_ind = 0; tab_war = 0; for(int i = -((int)tcykl.size()+5);i <= (int)tcykl.size()+5;i++) tab[i] = INF; int suma = 0, minimum = 0; tab[0] = 0; for(int i = 0;i < tcykl.size();i++) { suma += B[tcykl[i]]; minimum = min(minimum, suma); tab[suma] = min(tab[suma], i+1); } for(int i = tcykl.size()-1;i >= 0;i--) { char znak = B[tcykl[i]]; tab_war++; tab_ind += znak; tab[0-tab_ind] = 0-tab_war; if(tab[(minimum-1)-tab_ind]+tab_war <= tcykl.size()) minimum = minimum-1; else if(tab[minimum-tab_ind]+tab_war <= tcykl.size()) minimum = minimum; else minimum = minimum+1; int poczatkowe = A[zaw[tcykl[i]]]; int pelne = -1; if(poczatkowe <= (-minimum)) pelne = 0; else if(suma < 0) pelne = dzsuf(max(0,poczatkowe-(-minimum)), -suma); if(pelne >= 0) { int zostanie = poczatkowe-pelne*(-suma); //cerr << "Zostanie: " << zostanie << endl; int dodatkowo = tab[(-zostanie)-tab_ind]+tab_war; LL twyn = (LL)pelne*tcykl.size()+dodatkowo; wyn = min(wyn, MP(twyn, zaw[tcykl[i]])); } } } if(wyn.FI == LINF) printf("-1\n"); else { LL Kwyn = (wyn.FI-1)*n+wyn.SE; printf("%lld\n", Kwyn); } return 0; } |