문제는 아래 첨부 파일 참고하세요.
등수의 범위를 알고자 하는 학생(x)을 기준으로,
- 확실히 등수가 높은 학생 리스트 (아래 코드에서 up vector, x학생 포함)
- 확실히 등수가 낮은 학생 리스트 (아래 코드에서 down vector, x학생 포함)
아래 소스코드는 up/down vector에 학생 번호가 중복되어 있으면 삭제해서, unique(유일하게) 하는 코드 입니다.
sort(up.begin(), up.end());
up.erase(unique(up.begin(), up.end()), up.end());
sort(down.begin(), down.end());
down.erase(unique(down.begin(), down.end()), down.end());
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, x;
vector<int> up;
vector<int> down;
scanf_s("%d %d %d", &n, &m, &x);
int input[1000000][2];
for (int i = 0; i < m; i++) {
scanf_s("%d %d", &input[i][0], &input[i][1]);
}
up.push_back(x);
for (int i = 0; i < m; i++) {
for (int j = 0; j < up.size(); j++) {
if (input[i][1] == up[j]) {
up.push_back(input[i][0]);
}
}
}
down.push_back(x);
for (int i = 0; i < m; i++) {
for (int j = 0; j < down.size(); j++) {
if (input[i][0] == down[j]) {
down.push_back(input[i][1]);
}
}
}
sort(up.begin(), up.end());
up.erase(unique(up.begin(), up.end()), up.end());
sort(down.begin(), down.end());
down.erase(unique(down.begin(), down.end()), down.end());
printf("%d %d", up.size(), n - down.size()+1);
return 0;
}