# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
869215 | goodspeed0208 | JJOOII 2 (JOI20_ho_t2) | C++14 | 55 ms | 14312 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
signed main() {
int n, k;
cin >> n>> k;
string s;
cin >> s;
vector<int>v(n);
for (int i = 0 ; i < n ; i++) {
if (s[i] == 'J') v[i] = 0;
else if (s[i] == 'O') v[i] = 1;
else v[i] = 2;
}
vector<vector<int> >num(n, vector<int>(3, 0));
vector<vector<int> >pos(3);
num[0][v[0]]++;
pos[v[0]].push_back(0);
for (int i = 1 ; i < n ; i++) {
num[i] = num[i-1];
num[i][v[i]] = num[i-1][v[i]]+1;
pos[v[i]].push_back(i);
}
int mn = -1;
for (int i = 0 ; i < n ; i++) {
int l = i+k*3-2, r = n;
while (l+1 < r) {
int j = (l + r) / 2;
//cout << l << " " << r << " " << j << endl;
int numj, numi;
if (i == 0) numj = 0;
else numj = num[i-1][0];
numi = num[j][2];
if (numj + k > pos[0].size() || numi < k) {
l = j;
continue;
}
int posj = pos[0][(numj + k) - 1];
int posi = pos[2][(numi - k + 1) - 1];
if (num[posi][1] - num[posj][1] >= k) {
//cout << i << " " << j << "\n";
r = j;
} else {
l = j;
}
}
if (r == n) break;
//cout << i << " " << r << "\n";
if (mn == -1) mn = r - i + 1;
else mn = min(mn, r-i+1);
//for (int j = i+k*3-1 ; j < n ; j++) {
//}
}
if (mn == -1) cout << "-1\n";
else cout << mn - k * 3 << "\n";
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |