https://www.acmicpc.net/problem/14864
14864번: 줄서기
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 학생 수 N (1 ≤ N ≤ 100,000)과 순서쌍의 수 M (0 ≤ M ≤ 1,000,000)이 공백으로 분리되어 주어진다. 일렬로 서 있는 학생들을 순서대로 학생1, 학
www.acmicpc.net
입력으로 주어지는 쌍들을 이용해서 하나의 그래프를 생성할 수 있다.
그래프가 생성되면 각 정점에 입력 간선, 출력 간선이 생기고 그에 따라 각 학생이 가져야 하는 번호를 유추할 수 있다.
각 학생이 가져야 하는 번호를 유추하는 방법은, 해당 학생보다 작은 번호를 가진 학생 수와 큰 번호를 가진 학생 수를 통해서 알 수 있다.
예제 1번의 4번 정점으로 예시를 들면, 입력 간선의 개수는 1개, 출력 간선의 개수는 1개이다.
원래대로라면 자신보다 작은 번호를 가진 학생수는 1, 2, 3 총 3명이지만, 입력 간선으로 인해 이전 학생 중에 자신보다 큰 번호를 가진 학생수가 1명 존재하고, 출력 간선으로 인해 이후 학생 중에 자신보다 작은 번호를 가진 학생 수가 1명 존재한다.
따라서 less = out[i] + i - 1 - in[i] 이다.
자신보다 큰 번호를 가진 학생 수도 쉽게 구할 수 있다.
#include <iostream>
using namespace std;
int num[100001], in[100001], out[100001], ans[100001];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
out[a]++;
in[b]++;
}
for (int i = 1; i <= n; i++) {
int less = out[i] + i - 1 - in[i];
int greater = n - i - out[i] + in[i];
if (less + greater >= n || num[less + 1]) {
cout << -1;
return 0;
}
num[less + 1] = 1;
ans[i] = less + 1;
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << ' ';
}
}
'ps' 카테고리의 다른 글
[백준] 15559 - 내 선물을 받아줘 (0) | 2023.08.15 |
---|---|
[백준] 2325 - 개코전쟁 (0) | 2023.08.14 |
[백준] 2917 - 늑대 사냥꾼 (0) | 2023.08.08 |
[백준] 3114 - 사과와 바나나 (0) | 2023.08.07 |
[백준] 3117 - YouTube (0) | 2023.08.02 |
댓글