#include <cstdio>
#include <algorithm>
const long long int MAX = 1000001LL;
long long int n,m;
long long int gracze[MAX+1];
long long int kasa[MAX+1];
long long int lowest[MAX+1];
char wynikgry [MAX+1];
int main(){
scanf("%lld", &n);
for(int i = 0; i < n; ++i){
scanf("%lld", &gracze[i]);
kasa[i] = gracze[i];
lowest[i] = 0;
}
scanf("%lld", &m);
//for(int i = 0; i <= m; ++i){
scanf("%s", wynikgry);
// }
//::::Algo::::
long long int nww = (n*m)/(std::__gcd(n,m));
// printf("NWW: %lld\n", nww);
long long int gracz, wynik;
bool koniec = false;
for(int i = 0; i < nww; ++i){
gracz = i % n;
wynik = i % m;
if(wynikgry[wynik] == 'W'){
kasa[gracz]++;
}else{
kasa[gracz]--;
}
if(kasa[gracz] == 0){
//wynik:
printf("%d", i+1);
koniec = true;
break;
}else{
if(lowest[gracz] < gracze[gracz] - kasa[gracz]) lowest[gracz] = gracze[gracz] - kasa[gracz];
}
}
////debug:
// printf("\n");
// for(int i = 0; i < n; ++i){
// printf("%lld ", kasa[i]);
// }printf("\n");
////
if(!koniec){
long long int min, reszta;
for(int i = 0; i < n; ++i){
gracz = i;
if(gracze[gracz] > kasa[gracz]){
long long int rk = (gracze[gracz]-kasa[gracz]);
long long int mnoznik = 1;
reszta = 0;
while(kasa[gracz] > 0){
if(kasa[gracz]-lowest[gracz]>0){
mnoznik++;
kasa[gracz]-= rk;
}else{
reszta = kasa[gracz];
kasa[gracz] = 0;
}
}
// if(reszta == 0 && mnoznik >= 1) {
// mnoznik--;
// reszta+= rk;
// }
// printf("gracz: %lld, reszta: %lld\n", gracze[gracz],reszta);
if(reszta >= 0){
//find(reszta):
long long int tmp = nww/n;
for(int j = gracz; j < nww; j+=n){
if(wynikgry[j%m] == 'W'){
reszta++;
}else{
reszta--;
}
if(reszta == 0){
reszta = j;
break;
}
}
}
//end find;
gracze[gracz] = nww*mnoznik + reszta + 1;
}else{
gracze[gracz] = -1;
}
}
min = 0;
for(int i = 0; i < n; ++i){
if(gracze[i]!= -1){
if(gracze[min] == -1) {
min = i;
}
else {
if(gracze[min] > gracze[i]) {
min = i;
}
}
}
}
//wynik:
printf("%lld", gracze[min]);
}
//::::EndAlgo::::
// printf("\n");
// for(int i = 0; i < n; ++i){
// printf("%lld ", gracze[i]);
// }
/// printf("\n");
// for(int i = 0; i < m; ++i){
// printf("%c", wynikgry[i]);
// }
}
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include <cstdio> #include <algorithm> const long long int MAX = 1000001LL; long long int n,m; long long int gracze[MAX+1]; long long int kasa[MAX+1]; long long int lowest[MAX+1]; char wynikgry [MAX+1]; int main(){ scanf("%lld", &n); for(int i = 0; i < n; ++i){ scanf("%lld", &gracze[i]); kasa[i] = gracze[i]; lowest[i] = 0; } scanf("%lld", &m); //for(int i = 0; i <= m; ++i){ scanf("%s", wynikgry); // } //::::Algo:::: long long int nww = (n*m)/(std::__gcd(n,m)); // printf("NWW: %lld\n", nww); long long int gracz, wynik; bool koniec = false; for(int i = 0; i < nww; ++i){ gracz = i % n; wynik = i % m; if(wynikgry[wynik] == 'W'){ kasa[gracz]++; }else{ kasa[gracz]--; } if(kasa[gracz] == 0){ //wynik: printf("%d", i+1); koniec = true; break; }else{ if(lowest[gracz] < gracze[gracz] - kasa[gracz]) lowest[gracz] = gracze[gracz] - kasa[gracz]; } } ////debug: // printf("\n"); // for(int i = 0; i < n; ++i){ // printf("%lld ", kasa[i]); // }printf("\n"); //// if(!koniec){ long long int min, reszta; for(int i = 0; i < n; ++i){ gracz = i; if(gracze[gracz] > kasa[gracz]){ long long int rk = (gracze[gracz]-kasa[gracz]); long long int mnoznik = 1; reszta = 0; while(kasa[gracz] > 0){ if(kasa[gracz]-lowest[gracz]>0){ mnoznik++; kasa[gracz]-= rk; }else{ reszta = kasa[gracz]; kasa[gracz] = 0; } } // if(reszta == 0 && mnoznik >= 1) { // mnoznik--; // reszta+= rk; // } // printf("gracz: %lld, reszta: %lld\n", gracze[gracz],reszta); if(reszta >= 0){ //find(reszta): long long int tmp = nww/n; for(int j = gracz; j < nww; j+=n){ if(wynikgry[j%m] == 'W'){ reszta++; }else{ reszta--; } if(reszta == 0){ reszta = j; break; } } } //end find; gracze[gracz] = nww*mnoznik + reszta + 1; }else{ gracze[gracz] = -1; } } min = 0; for(int i = 0; i < n; ++i){ if(gracze[i]!= -1){ if(gracze[min] == -1) { min = i; } else { if(gracze[min] > gracze[i]) { min = i; } } } } //wynik: printf("%lld", gracze[min]); } //::::EndAlgo:::: // printf("\n"); // for(int i = 0; i < n; ++i){ // printf("%lld ", gracze[i]); // } /// printf("\n"); // for(int i = 0; i < m; ++i){ // printf("%c", wynikgry[i]); // } } |
English