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
| #include <iostream> #include <cstdio> using namespace std;
namespace SHAWN { const int N = 1e6 + 7; int a[N]; int n, m, jmax, omax, sum; struct node { int l, r; }b[N << 1]; inline void _init() { int jlidx, jridx, olidx, oridx, tmp1, tmp2, tag1, tag2; jlidx = olidx = 1; jridx = oridx = n; tmp1 = tmp2 = 0; for (int i = 1; i <= n; ++i) { tmp1 += a[i]; if (a[i] == 1) { tag1 = i + 1; break; } } for (int i = n; i >= 1; --i) { tmp2 += a[i]; if (a[i] == 1) { tag2 = i - 1; break; } } if (sum % 2) { jmax = sum; if (tmp1 < tmp2) { omax = sum - tmp1; olidx = tag1; } else { omax = sum - tmp2; oridx = tag2; } } else { omax = sum; if (tmp1 < tmp2) { jmax = sum - tmp1; jlidx = tag1; } else { jmax = sum - tmp2; jridx = tag2; } } int otmp = omax, jtmp = jmax; b[omax] = {olidx, oridx}; b[jmax] = {jlidx, jridx}; while (olidx < oridx && otmp > 0) { otmp -= 2; if (a[olidx] == 1) { if (a[oridx] == 1) { b[otmp] = {++olidx, --oridx}; } else if (a[oridx] == 2) { b[otmp] = {olidx, --oridx}; } } else if (a[olidx] == 2) { b[otmp] = {++olidx, oridx}; } } while (jlidx < jridx && jtmp > 0) { jtmp -= 2; if (a[jlidx] == 1) { if (a[jridx] == 1) { b[jtmp] = {++jlidx, --jridx}; } else if (a[jridx] == 2) { b[jtmp] = {jlidx, --jridx}; } } else if (a[jlidx] == 2) { b[jtmp] = {++jlidx, jridx}; } } return; } int work() { cin >> n >> m; for (int i = 1; i <= n; ++i) { char c; cin >> c; if (c == 'T') { a[i] = 2; } else if (c == 'W') { a[i] = 1; } sum += a[i]; } _init(); while (m--) { int sar; cin >> sar; if (sar % 2 && sar > jmax) { cout << "NIE\n"; continue; } else if (!(sar % 2) && sar > omax) { cout << "NIE\n"; continue; } cout << b[sar].l << ' ' << b[sar].r << '\n'; } return 0; } }
signed int main() { ios :: sync_with_stdio(false); cin.tie(nullptr); return SHAWN :: work(); }
|