제출 #1271477

#제출 시각아이디문제언어결과실행 시간메모리
1271477kaiboy영역 (JOI16_ho_t4)C++20
100 / 100
30 ms9032 KiB
#include <algorithm> #include <iostream> using namespace std; const int N = 100000; char cc[N + 1]; long long xx[N], yy[N]; long long xxo[N], yyo[N], ll[N], rr[N], ii[N]; long long xxo_[N], yyo_[N], ll_[N], rr_[N]; long long aa[N * 8]; int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int n, k; cin >> n >> k >> cc; long long x_ = 0, y_ = 0; for (int i = 0; i < n; i++) { xx[i] = x_; yy[i] = y_; char c = cc[i]; if (c == 'E') x_++; else if (c == 'N') y_++; else if (c == 'W') x_--; else y_--; } if (x_ < 0) { for (int i = 0; i < n; i++) xx[i] *= -1; x_ *= -1; } if (y_ < 0) { for (int i = 0; i < n; i++) yy[i] *= -1; y_ *= -1; } if (!x_) { for (int i = 0; i < n; i++) swap(xx[i], yy[i]); swap(x_, y_); } if (!x_) k = 1; for (int i = 0; i < n; i++) { long long xo = xx[i], yo = yy[i], a = 0; if (x_) if (xo < 0) { long long b = (-xo + x_ - 1) / x_; xo += x_ * b; yo += y_ * b; a -= b; } else { long long b = xo / x_; xo -= x_ * b; yo -= y_ * b; a += b; } xxo[i] = xo; yyo[i] = yo; ll[i] = a; rr[i] = a + k; if (!i) rr[i]++; ii[i] = i; } sort(ii, ii + n, [] (int i, int j) { if (xxo[i] != xxo[j]) return xxo[i] < xxo[j]; if (yyo[i] != yyo[j]) return yyo[i] < yyo[j]; return ll[i] < ll[j]; }); int n_ = 0; for (int hl = 0, hr; hl < n; hl = hr) { int i = ii[hl]; long long xo = xxo[i], yo = yyo[i], l = ll[i], r = rr[i]; for (hr = hl + 1; hr < n; hr++) { i = ii[hr]; if (xxo[i] > xo || yyo[i] > yo) break; if (ll[i] <= r) r = max(r, rr[i]); else { xxo_[n_] = xo; yyo_[n_] = yo; ll_[n_] = l; rr_[n_] = r; n_++; l = ll[i]; r = rr[i]; } } xxo_[n_] = xo; yyo_[n_] = yo; ll_[n_] = l; rr_[n_] = r; n_++; } n = n_; long long ans = 0; for (int i = 0; i < n; i++) { xxo[i] = xxo_[i]; yyo[i] = yyo_[i]; ll[i] = ll_[i]; rr[i] = rr_[i]; } for (int i0 = 0; i0 < n; i0++) { long long xo0 = xxo[i0], yo0 = yyo[i0]; if (i0 && xo0 == xxo[i0 - 1] && yo0 == yyo[i0 - 1]) continue; long long xo1 = xo0, yo1 = yo0 + 1; long long xo2 = xo0 + 1, yo2 = yo0; long long xo3 = xo0 + 1, yo3 = yo0 + 1; if (x_ && xo0 + 1 == x_) { xo2 = 0, yo2 -= y_; xo3 = 0, yo3 -= y_; } int lower = -1, upper = n; while (upper - lower > 1) { int i1 = lower + upper >> 1; if (xxo[i1] != xo1 ? xxo[i1] > xo1 : yyo[i1] >= yo1) upper = i1; else lower = i1; } int i1 = upper; lower = -1, upper = n; while (upper - lower > 1) { int i2 = lower + upper >> 1; if (xxo[i2] != xo2 ? xxo[i2] > xo2 : yyo[i2] >= yo2) upper = i2; else lower = i2; } int i2 = upper; lower = -1, upper = n; while (upper - lower > 1) { int i3 = lower + upper >> 1; if (xxo[i3] != xo3 ? xxo[i3] > xo3 : yyo[i3] >= yo3) upper = i3; else lower = i3; } int i3 = upper; if (i1 == n || xxo[i1] > xo1 || yyo[i1] > yo1) continue; if (i2 == n || xxo[i2] > xo2 || yyo[i2] > yo2) continue; if (i3 == n || xxo[i3] > xo3 || yyo[i3] > yo3) continue; int m = 0; for (int i = i0; i < n && xxo[i] == xo0 && yyo[i] == yo0; i++) { aa[m++] = ll[i] * 8 + 0; aa[m++] = rr[i] * 8 + 1; } for (int i = i1; i < n && xxo[i] == xo1 && yyo[i] == yo1; i++) { aa[m++] = ll[i] * 8 + 2; aa[m++] = rr[i] * 8 + 3; } bool off = x_ && xo0 + 1 == x_; for (int i = i2; i < n && xxo[i] == xo2 && yyo[i] == yo2; i++) { aa[m++] = (ll[i] - off) * 8 + 4; aa[m++] = (rr[i] - off) * 8 + 5; } for (int i = i3; i < n && xxo[i] == xo3 && yyo[i] == yo3; i++) { aa[m++] = (ll[i] - off) * 8 + 6; aa[m++] = (rr[i] - off) * 8 + 7; } sort(aa, aa + m); int k0 = 0, k1 = 0, k2 = 0, k3 = 0; for (int i = 0; i + 1 < m; i++) { long long a_ = aa[i], a = a_ / 8; int t = a_ % 8; if (t < 0) a--, t += 8; if (t == 0) k0++; else if (t == 1) k0--; else if (t == 2) k1++; else if (t == 3) k1--; else if (t == 4) k2++; else if (t == 5) k2--; else if (t == 6) k3++; else k3--; if (k0 && k1 && k2 && k3) { long long b_ = aa[i + 1], b = b_ / 8; int s = b_ % 8; if (s < 0) b--, s += 8; ans += b - a; } } } cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...