#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;
typedef long long ll;
typedef pair<ll,int> plli;
// struct three {
// int index, quot, rem;
// three(int _index, int _quot, int _rem)
// : index(_index), quot(_quot), rem(_rem) { }
// };
vector<int> budget, cycle_vals;
deque<int> Q, emptyQ;
priority_queue<plli, vector<plli>, greater<plli> > finals;
char cycle_string[1000001];
int change_in_cycle;
int main() {
ll n;
scanf("%lld", &n);
// change_in_cycle.resize(n);
budget.resize(n);
cycle_vals.resize(n);
for(int i = 0; i < n; i++)
scanf("%d", &budget[i]);
ll m;
scanf("%lld", &m);
scanf("%s", cycle_string);
for(int i = 0; i < m; i++)
cycle_vals[i] = cycle_string[i] == 'W' ? 1 : -1;
// count change in cycle
// change_in_cycle = cycle_vals[0];
// for(int i = (n >= m ? n-m : n);; i += n) {
// while(i >= m) i -= m;
// if(i == 0) break;
// change_in_cycle += cycle_vals[i];
// }
for(int i = 0; i < m; i++)
change_in_cycle += cycle_vals[i];
// printf("before-1\n");
if(change_in_cycle >= 0) {
printf("-1");
return 0;
}
// printf("after-1\n");
// printf("change_in_cycle: %d\n", change_in_cycle);
int min_cycle_count = 1073741824;
for(int i = 0; i < n; i++) {
div_t d = div(budget[i], -change_in_cycle);
if(d.quot <= min_cycle_count) {
if(d.quot < min_cycle_count) Q = emptyQ;
min_cycle_count = d.quot;
if(d.rem == 0) Q.push_front(i);
else Q.push_back(i);
}
}
min_cycle_count++;
// printf("min_cycle_count: %d\n", min_cycle_count);
while(!Q.empty()) {
int curr = Q.front();
Q.pop_front();
// printf("budget[%d] %d\tmin_cycle_count %d\tchange_in_cycle %d\n", curr, budget[curr], min_cycle_count, change_in_cycle);
int bdgt = budget[curr] + min_cycle_count*change_in_cycle;
ll ttime = (ll)curr + ((ll)min_cycle_count)*n,
counter = ttime % m;
// printf("curr %d\tbdgt %d\tttime %lld\tcounter %lld\n", curr+1, bdgt, ttime, counter);
while(bdgt > 0) {
counter++;
ttime += n;
while(counter >= m) counter -= m;
// printf("\tttime %lld\tcounter %lld\n", ttime, counter);
bdgt += cycle_vals[counter];
}
finals.push(plli(ttime, curr));
// printf("\n\n");
}
// printf("before\n");
// if(!finals.empty()) printf("%d %d", finals.top().first+1, finals.top().second+1);
if(!finals.empty()) printf("%lld", finals.top().first+1LL);
else printf("-1");
// printf("after\n");
// ^^^^^^^^^^^^^ just in case
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 106 107 108 109 110 111 112 | #include <cstdio> #include <vector> #include <queue> #include <cstdlib> using namespace std; typedef long long ll; typedef pair<ll,int> plli; // struct three { // int index, quot, rem; // three(int _index, int _quot, int _rem) // : index(_index), quot(_quot), rem(_rem) { } // }; vector<int> budget, cycle_vals; deque<int> Q, emptyQ; priority_queue<plli, vector<plli>, greater<plli> > finals; char cycle_string[1000001]; int change_in_cycle; int main() { ll n; scanf("%lld", &n); // change_in_cycle.resize(n); budget.resize(n); cycle_vals.resize(n); for(int i = 0; i < n; i++) scanf("%d", &budget[i]); ll m; scanf("%lld", &m); scanf("%s", cycle_string); for(int i = 0; i < m; i++) cycle_vals[i] = cycle_string[i] == 'W' ? 1 : -1; // count change in cycle // change_in_cycle = cycle_vals[0]; // for(int i = (n >= m ? n-m : n);; i += n) { // while(i >= m) i -= m; // if(i == 0) break; // change_in_cycle += cycle_vals[i]; // } for(int i = 0; i < m; i++) change_in_cycle += cycle_vals[i]; // printf("before-1\n"); if(change_in_cycle >= 0) { printf("-1"); return 0; } // printf("after-1\n"); // printf("change_in_cycle: %d\n", change_in_cycle); int min_cycle_count = 1073741824; for(int i = 0; i < n; i++) { div_t d = div(budget[i], -change_in_cycle); if(d.quot <= min_cycle_count) { if(d.quot < min_cycle_count) Q = emptyQ; min_cycle_count = d.quot; if(d.rem == 0) Q.push_front(i); else Q.push_back(i); } } min_cycle_count++; // printf("min_cycle_count: %d\n", min_cycle_count); while(!Q.empty()) { int curr = Q.front(); Q.pop_front(); // printf("budget[%d] %d\tmin_cycle_count %d\tchange_in_cycle %d\n", curr, budget[curr], min_cycle_count, change_in_cycle); int bdgt = budget[curr] + min_cycle_count*change_in_cycle; ll ttime = (ll)curr + ((ll)min_cycle_count)*n, counter = ttime % m; // printf("curr %d\tbdgt %d\tttime %lld\tcounter %lld\n", curr+1, bdgt, ttime, counter); while(bdgt > 0) { counter++; ttime += n; while(counter >= m) counter -= m; // printf("\tttime %lld\tcounter %lld\n", ttime, counter); bdgt += cycle_vals[counter]; } finals.push(plli(ttime, curr)); // printf("\n\n"); } // printf("before\n"); // if(!finals.empty()) printf("%d %d", finals.top().first+1, finals.top().second+1); if(!finals.empty()) printf("%lld", finals.top().first+1LL); else printf("-1"); // printf("after\n"); // ^^^^^^^^^^^^^ just in case return 0; } |
English