제출 #1131109

#제출 시각아이디문제언어결과실행 시간메모리
1131109ezdubzJJOOII 2 (JOI20_ho_t2)C++20
100 / 100
13 ms1960 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; #define INF 2000000000 string s2 = "", s = ""; vector<int> v[3]; int zerosize, onesize, twosize, J = 0, O = 0, I = 0, JO = 0, OI = 0, n, k, res = INF, p0 = 0, p1 = 0, p2 = 0; ; void solve() { bool notfirst = false; for (int i = 1; i < k; i++) { J += v[0][i] - v[0][i-1] - 1; O += v[1][i] - v[1][i-1] - 1; I += v[2][i] - v[2][i-1] - 1; } if (v[1][0] > v[0][k-1]) JO = v[1][0] - v[0][k-1] - 1; if (v[2][0] > v[1][k-1]) OI = v[2][0] - v[1][k-1] - 1; while (p0 + k <= zerosize && p1 + k <= onesize && p2 + k <= twosize) { //find J if (notfirst) J += v[0][p0+k-1] - v[0][p0+k-2] - (v[0][p0] - v[0][p0-1]); // find O if (v[1][p1] < v[0][p0+k-1]) { while (p1 + k <= onesize && v[1][p1] < v[0][p0+k-1]) { if (p1 + k == onesize) return; O -= v[1][p1+1] - v[1][p1] - 1; O += v[1][p1+k] - v[1][p1+k-1] - 1; p1++; } } /*if (notfirst) */JO = v[1][p1] - v[0][p0+k-1] - 1; // find I if (v[2][p2] < v[1][p1+k-1]) { while (p2 + k <= twosize && v[2][p2] < v[1][p1+k-1]) { if (p2 + k == twosize) return; I -= v[2][p2+1] - v[2][p2] - 1; I += v[2][p2+k] - v[2][p2+k-1] - 1; p2++; } } /*if (notfirst) */OI = v[2][p2] - v[1][p1+k-1] - 1; res = min(res, J + O + I + JO + OI); //cout << p0 << " " << p1 << " " << p2 << "--" << J << " " << O << " " << I << " " << JO << " " << OI << endl; p0++; notfirst = true; } } int main() { cin >> n >> k; bool jyet = false, iyet = false; for (int i = 0; i < n; i++) { char a; cin >> a; if (a == 'J') jyet = true; if (jyet) s2 += a; } for (int i = s2.length() - 1; i >= 0; i--) { if (s2[i] == 'I') iyet = true; if (iyet) s += s2[i]; } reverse(s.begin(), s.end()); n = s.length(); for (int i = 0; i < n; i++) { if (s[i] == 'J') v[0].push_back(i); else if (s[i] == 'O') v[1].push_back(i); else v[2].push_back(i); } zerosize = v[0].size(), onesize = v[1].size(), twosize = v[2].size(); // cout << "bef" << zerosize << " " << onesize << " " << twosize << endl; if (n == 0 || zerosize < k || onesize < k || twosize < k) { cout << -1; return 0; } solve(); if (res == INF) cout << -1; else cout << res; } // 13 2 JOJIOIOOJOJII
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...