문제 풀이 35

BOJ 20156 - 기왕 이렇게 된 거 암기왕이 되어라 [C++]

문제https://www.acmicpc.net/problem/20156 $i$번 정점의 부모가 $p_i$인 포레스트가 주어지고, 아래와 같은 쿼리가 $M$개 주어진다.$x$ : $x$와 $x$의 부모를 잇는 간선이 아직 존재한다면, 끊는다. 이 때, 아래와 같은 질의 $K$개를 처리해야 한다.$a$ $b$ $c$ : $a$번 쿼리까지 수행되었을 때, $b$와 $c$가 연결되어있는가? 풀이쿼리에 의해 끊어지는 간선들은 모두 끊어놓고 질의를 오프라인으로 처리한다.쿼리를 역순으로 수행하면 간선을 잇는 쿼리로 바뀌며, 각 질의는 분리 집합으로 해결할 수 있게 된다. #include using namespace std;using ll = long long;int root[100001]{};int find(int ..

문제 풀이 2024.05.01

BOJ 13907 - 세금 [C++]

문제https://www.acmicpc.net/problem/13907 간선의 가중치가 시간 $t$에 대한 일차함수의 형태인 무방향 그래프와, 정수 $s, e$가 주어진다.특정 시간 $t$에서, $s$에서 $e$로 가는 최단 거리를 구해야 한다. 풀이최단 경로에는 어떠한 경우에도 같은 간선이 두 번 이상 포함되지 않는다. 즉, 최대 $N-1$개의 간선만을 지난다.따라서 다음과 같은 정의를 쉽게 떠올릴 수 있다.$dist[n][k]$는 $s$번 도시에서 $n$번 도시까지 $k$개의 간선을 지나서 갔을 때의 최단 거리이제 그대로 다익스트라를 돌려주고, 쿼리가 주어질 때마다 $psum += p$ 후에 $\min(dist[e][j] + j \times psum)$을 출력하면 된다. #include using n..

문제 풀이 2024.05.01

BOJ 25549 - 트리의 MEX [C++]

문제https://www.acmicpc.net/problem/25549 $N$개의 정점으로 구성된 루트 있는 트리의 각 정점에 정수가 하나씩 쓰여있다.$mex(i)$를 $i$번 정점을 루트로 하는 서브트리의 정점에 적혀 있지 않은 수 중에서 가장 작은 음이 아닌 정수라고 할 때, $1 \le i \le N$인 모든 $i$에 대해 $mex(i)$를 출력해라. 풀이정점 $i$의 서브트리에 적혀 있는 모든 수의 집합(std::set)을 $S_i$라 하자.dfs를 돌면서 부모 정점 $n$과 그 자식 정점들 $c_1, c_2, \ldots, c_j$에 대해, $S_n$과 $S_{c_1}, S_{c_2}, \ldots, S_{c_j}$를 모두 합쳐서 $mex(n)$을 직접 구하는 풀이가 가능하다.집합을 small ..

문제 풀이 2024.05.01

BOJ 15683 - 감시 [C++]

문제https://www.acmicpc.net/problem/15683 스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감시할 수 있는 방법은 다음과 같다. 1번 CCTV는 한 쪽 방향만 감시할 수 있다. 2번과 3번은 두 방향을 감시할 수 있는데, 2번은 감시하는 방향이 서로 반대방향이어야 하고, 3번은 직각 방향이어야 한다. 4번은 세 방향, 5번은 네 방향을 감시할 수 있다.CCTV는 감시할 수 있는 방향에 있는 칸 전체를 감시할 수 있다. 사무실에는 벽이 있는데, CCTV는 벽을 통과할 수 없다. CCTV가 감시할 수 없는 영역은 사각지대라고 ..

문제 풀이 2024.05.01

4월의 문제 풀이 - (3)

4/21BOJ 27452 - (재밌고 웃기고 센스있고 깔끔한 제목)Platinum 5더보기#recursion $|S_i|$가 $10^{18}$보다 커지는 $i$의 최솟값을 찾아서 주어지는 $n, k$를 그 범위 안으로 끌어내리고 그 때부턴 직접 재귀로 찾아주면 된다. BOJ 12963 - 달리기Platinum 3더보기#greedy   #disjoint_set 도로를 역순으로 하나씩 배치하면서 $0$과 $N-1$을 잇게 되면 그 가중치만큼의 사람을 이동시켜주면 된다.$i$번 도로가 배치되어있다고 가정하면, $i-1$번 이하의 모든 도로 사람들을 수용할 수 있다. $3^i > 3^{i-1} + \cdots + 3^0$이기 때문이다. BOJ 27894 - 특별한 숙제 순서 바꾸기Platinum 4더보기연산을 ..

문제 풀이 2024.05.01

4월의 문제 풀이 - (2)

4/11 BOJ 24136 - 冊子の配布 (Distribution) Platinum 4 더보기 #greedy #dfs dfs를 $M$번 돌리며, 돌 때마다 가장 이득이 되는 리프 노드를 찾으면 된다. BOJ 15900 - 나무 탈출 Silver 1 더보기 #dfs 루트에서 모든 리프까지의 거리 합을 구하면 된다. BOJ 13164 - 행복 유치원 Gold 5 더보기 #greedy #sorting 인접한 두 원소의 차 중 큰 값을 $N-K$개 더하면 된다. BOJ 22104 - Три ладьи Gold 3 더보기 #case_work 주어진 판에서 나올 수 있는 서로 다른 경우의 수는 6가지밖에 없다. BOJ 11000 - 강의실 배정 Gold 5 더보기 #sweeping #priority_queue 우선..

문제 풀이 2024.04.22

4월의 문제 풀이 - (1)

너무 오래 쉰 것 같다. 종강을 하고도 PS는 종종 했지만, 글 쓰는게 귀찮아서 방치하다가 4개월치나 밀려버렸다. 한 번에 쓰기에는 문제 수가 너무 많아서 4월부터 다시 시작하려 한다... 4/2 BOJ 4384 - 공평하게 팀 나누기 Gold 1 더보기 #knapsack #dp 모든 사람들의 몸무게 합은 $45\,000$ 이하이고, 사람의 수가 $100$명 이하이다. 따라서, 사람이 한 명씩 추가될 때마다 (몸무게 합, 사람 수)로 가능한 경우를 knapsack dp로 갱신해주면 된다. BOJ 1043 - 거짓말 Gold 4 더보기 #bfs 주어진 $M$개의 파티 정보로 양방향 그래프를 만들고, 진실을 아는 사람들을 시작점으로 한 뒤 bfs를 돌려주자. bfs 수행 중에 만나는 모든 사람들에게는 거짓말..

문제 풀이 2024.04.13

BOJ 1176 - 섞기 [C++]

https://www.acmicpc.net/problem/1176 1176번: 섞기 첫 줄에는 학생의 수 N(1 ≤ N ≤ 16)과 최소 넘어야할 키의 차이 값 K(1 ≤ K ≤ 3,400)가 주어진다. 다음 N개의 줄에는 학생들의 키가 순서대로 들어온다. 키는 25,000 이하인 자연수만 들어온다. www.acmicpc.net 문제 요약 학생 $N$명이 줄을 서야 한다. 각 학생은 자신과 이웃한 모든 학생과 키의 차이가 $K$보다 크도록 줄을 서야 할 때, 줄을 서는 경우의 수를 구하는 문제이다. 문제 해결 $N$의 제한 $1 \le N \le 16$에 주목하자. bitmask dp가 딱 떠오르는 제한이다. 다음과 같이 식을 세워보자. $dp[i][j] = $지금까지 줄을 선 학생들의 집합이 이진수 $..

문제 풀이 2023.12.14

BOJ 24502 - blobsad [C++]

https://www.acmicpc.net/problem/24502 24502번: blobsad 채완이와 주환이가 이 일을 마칠 수 있는 최소 시간을 초 단위로 출력한다. 만약, 마칠 수 없다면 blobsad를 출력한다. www.acmicpc.net 문제 요약 길이 $N$인 수열 $A$와 양의 정수 $K$가 주어진다. 이 수열에 작업을 할 수 있다. 어떤 $i$에 대해, $A_i$를 1 줄이고 $A_{i-1}$ 혹은 $A_{i+1}$을 1 올린다. 모든 $i$에 대해 $A_i$가 $K$의 배수가 되도록 만들 때, 작업 횟수의 최솟값을 구하는 문제이다. 문제 해결 문제 $A_i$가 $K$의 배수인가를 결정짓는 요소는 $A_i \bmod{K}$이다. 따라서, 주어진 모든 $A_i$를 $A_i \bmod{K}..

문제 풀이 2023.12.12

BOJ 9015 - 정사각형 [C++]

https://www.acmicpc.net/problem/9015 9015번: 정사각형 각 테스트 케이스마다 가장 큰 정사각형의 넓이를 한 줄에 하나씩 출력한다. 단, 정사각형이 없는 경우 0을 출력한다. www.acmicpc.net 문제 요약 평면 위에 $N$개의 점이 주어졌을 때, 가장 큰 정사각형의 넓이를 구하는 문제이다. 문제 해결 어떠한 두 점 $P, Q$를 골랐을 때, 그 두 점을 이은 선분을 변으로 갖는 정사각형이 있는지 알 수 있을까? 그 두 점의 $x$좌표 변화량과 $y$좌표 변화량을 각각 $dx, dy$라고 하자. $P, Q$를 $(dx, -dy)$만큼 대칭이동한 점이 둘 다 존재한다면 정사각형이 된다. 이렇게 만들어진 사각형은 모두 변의 길이가 같고, 네 각이 항상 직각이 되기 때문에..

문제 풀이 2023.12.12