문제풀이 모든 Q의 쌍을 비교하여 두 개의 쿼리중에 어떤 것이 가능한지 판단한다. 하나라도 불가능하면 0을 출력 주의사항 소요시간 30분 문제링크
(1 shl (K - 1) <= A < 1 shl K)이고, 스코어가 최대가 되는 N개의 수를 구한다.N의 개수가 (1 shl (K - 1))보다 크면 모든 경우를 대입해 주고, 아니면 i는 0에서 N까지, (1 shl (K - 1)) + (i의 bit 좌우
dp[사람 수][1번 팀의 점수][2번 팀의 점수] = 최소 횟수로 두고 dp테이블을 채워나간다.
통행 금지되는 부분을 전부 제외하고 플로이드 워셜 알고리즘을 활용하여 최단 거리를 구한다.쿼리를 역순으로 탐색한다.쿼리 1번의 경우에는 모든 지점의 쌍에서의 최단 거리를 새로 갱신한다.쿼리 2번의 경우에는 최단 거리를 출력한다.
Alice의 마지막 순서에 M의 배수가 되면 Bob이 이긴다.
현재값이 이전 평균값보다 크거나 같으면 합해주고, 아니면 스택에 저장한다.스택에 값을 넣을 때, 이전에 들어있는 값의 평균보다 크거나 같으면 합해준다.
기준점을 하나 잡고 다른 수들을 비교해 가면서 기준점과 같으면 A 리스트, 다르면 B 리스트에 넣는다.A, B 리스트 중에 현재 남아 있는 가짜 동전 개수(M)보다 size가 큰 리스트가 있으면 그 리스트 전체가 진짜 동전 집합이고, 나머지 리스트가 가짜 동전 집합이다
bfs를 활용하여 각 조건의 최소값을 더해준다.
|S|의 누적합을 구한다.1 ~ N요소가 S에 포함되는 구간을 구하고, 그 구간 사이의 |S|의 합을 구한다.Int형 오버플로우 주의 -> Long
D를 (A + B)로 나눈 나머지를 구한다.전체 구간의 길이가 A보다 작거나, 임의의 인접한 구간의 길이가 B보다 크면 가능하다.
C의 0 ~ 59번째의 비트를 순회하며 1이면 A, B 둘 중에 하나, 0이면 A, B 모두 or 둘 다 적용하지 않으면서 조건을 만족하는 A, B를 찾는다.
LLL...LL or RRR...RR의 경우에만 조건을 만족할 수 있으므로 두 개의 경우로 나눠서 경우의 수를 구하고 더한다.?일때, L, R 모두 가능하면 2를 곱한다.
01011010와 같은 형식을 만들면 된다.앞에서부터 (0101..., 1010...)와 같은 형식을 만드는데 필요한 비용을 forwardSumC로 두고, 뒤에서부터 (...1010, ...0101)와 같은 형식을 만드는데 필요한 비용을 backwardSumC로 두고
쿼리를 뒤에서부터 실행한다.가로로 칠했으면 h--, 세로로 칠했으면 w--를 해주면서 각 X의 개수를 카운팅한다.
B4 + 2B5 >= 2A1 + A2 - A4 - A5를 만족하는 값 중에서 최소값을 찾으면 된다.Ai : 기존 리뷰 개수, Bi : 추가 리뷰 개수
dp[주머니 번호][단어의 길이] = 최소 비용으로 두고 dp테이블을 채워나간다.
양방향 LinkedList를 구현한다. 삽입, 삭제 연산을 수행한다.
주어진 숫자를 나눌 수 있는 가장 큰 제곱수로 나눈다.0이면 모든 쌍이 가능하고, 0이 아닌 나머지 수들은 값이 같은 것들의 쌍의 개수를 구하면 된다.
이분 탐색을 통해 K번째를 찾는다.
Bi 주머니에 Ai개의 공이 들어있을 때, i, i구간에 Ai개를 빼고, 0, N-1구간에 Ai / N개를 더하고, Bi % Ai개를 처리해 주면 된다.구간 업데이트가 존재하므로 lazy propagation을 이용한 segmentTree를 구현한다.
현재 값이 A라 했을 때, 이전 인덱스까지의 부분 수열 중에서 마지막 숫자가 A - D, A + D범위에 들어가는 수열의 길이의 최대값을 구한 후 1을 더한다.구간의 최대값을 구해야 하므로 segmentTree를 구현한다.
r에 대하여 조건을 만족하는 l의 범위를 구한다. (Lr = 조건을 만족하는 최소 l)N개의 구간에서 r일 때 l+1부터 가능하다.r의 최소 l은 r-1의 최소 l보다 크거나 같아야한다.
현재 구간에서 왼쪽 절반을 검사하면 구간의 왼쪽에 있는지 오른쪽에 있는지 알 수 있다.depth가 같은 구간끼리 묶어서 검사한다.
forwardCountArr = 앞에서 부터 1~K를 만들 수 있는 최대 K값, backwardCountArr = 뒤에서 부터 1~K를 만들 수 있는 최대 K값을 구한다.minOf(forwardCountArri, backwardCountArri)의 최대값을 구한다
0부터 제곱수를 구하고, 각 자리수(0~9)의 개수를 S와 비교한다.
(사이즈, 개수)쌍으로 treeMap에 저장한다.사이즈 작은 순으로 합성한다.
누적합과 투 포인터를 사용하여 효율적으로 합을 구한다.
0 ~ N까지의 숫자의 개수를 카운팅한다.숫자의 개수가 0인 것을 treeSet에 저장하며 mex값을 구한다.
dfs를 사용하여 각 좌표를 구한다.좌표값이 하나로 고정되어 있지 않은 값이 있으면, dfs를 사용하여 그 지점에서 도달할 수 있는 모든 좌표를 "undecidable"로 표시한다.
dfs를 사용하여 만나는 얼음의 개수를 카운팅한다.
1 ~ N값에 대해 그룹을 지어서 idxList를 만든다.각 그룹의 idxList의 누적합 리스트를 만든다.누적합을 이용하여 개수를 카운팅하고, 같은 그룹의 3개의 숫자가 묶인 경우를 뺀다.overflow 조심
dp[의석 수] = 최소 이동 인원로 두고 dp테이블을 채워나간다.
사람의 시야가 닿는 곳을 갈 수 없는 곳으로 표시한다.bfs를 사용하여 최단 거리를 구한다.
bfs를 활용하여 1번 책을 읽기 위해 필요한 책 번호를 구한다.위상 정렬을 사용하여 책 번호의 순서를 구한다.
방향 그래프를 구성한다.보험이 가입되는 최대 자식 depth를 배열에 저장한다.1부터 시작하는 dfs를 사용하여 현재 구성원이 보험에 가입이 되어있는지 여부를 판단한다.
이분 탐색을 통해 각 딸기가 어떤 영역에 속해 있는지 구분한다. HashMap에 각 딸기의 영역을 저장하고 최대, 최소값을 구한다.
union & find를 사용하여 그룹을 짓는다.Good Graph를 판단하기 위한 정점들의 그룹 인덱스 쌍을 구하여 HashSet에 저장한다.쿼리에서 주어진 정점들의 그룹 인덱스 쌍이 HashSet에 들어있으면 "No", 아니면 "Yes"
2진수로 나타낸 s, n의 길이를 동일하게 맞춘다.앞에서 부터 '?'를 '1'로 만들 수 있는지 확인하여 가능하면 '1', 불가능하면 '0'으로 치환한다.
소수 리스트를 구한다.a, b를 정해놓고, 이분 탐색을 사용하여 가능한 c의 범위를 구한다.
각 쿼리마다 나머지를 계산한다.
우선 순위 큐와 TreeSet을 사용하여 현재 시간에 가장 앞 열에 있는 사람을 구한다.
N / 2개의 쌍을 선택하는 모든 경우의 수를 고려한다.시간 초과를 피하기 위해 중복되는 경우를 제외한다.
비트 마스킹을 통해 개수를 저장한다.previ = 현재 인덱스까지 만들 수 있는 부분 문자열에서 등장하는 i의 개수
M으로 나눈 나머지가 연속되는 숫자인 것들의 합의 최대값을 구한다.
x, y좌표로 나눠서 생각한다.dp\[-10000 ~ 10000 사이의 좌표값] = 가능한 위치 여부(Boolean)로 두고 N번 반복한다.
x^2 + y^2 = M이 되는 (x, y)의 쌍을 구한다.bfs를 이용하여 각 지점에 도달할 수 있는 최소 횟수를 구한다.
'('를 1, ')'를 -1의 가중치를 두고 dp현재까지의 가중치 = 경우의 수로 둔다.S를 순회하며 dp테이블을 채워나간다.
TreeMap을 사용하여 막대를 관리한다. (막대의 시작, 막대의 끝)자른 부분을 기준으로 왼쪽, 오른쪽 막대로 분리한다.
(0 ~ T의 전체 합)의 Boolean배열을 만들고, 가능한 경우를 모두 체크한다.가능한 최단 시간을 구한다.
A를 순회하며 1122 Substring을 만족하는 연속 부분 수열을 queue에 저장한다.각 숫자의 count가 0 or 2여야 한다.같은 숫자가 연속으로 2번 등장해야 한다.4개의 경우로 나눠서 처리한다.같은 숫자가 연속으로 2번 등장한 경우 & 등장한 숫자의 co
약수가 9개가 되려면 (x^8) or (x^2 \* y^2)의 형태를 갖고 있어야 한다. (x, y는 소수)소수 리스트를 구하고 위의 2가지의 경우를 만족하는 경우의 수를 카운팅 한다.15분https://atcoder.jp/contests/abc383/task
우선 순위 큐를 이용하여 인접한 슬라임을 약한 순서로 정렬한다.우선 순위 큐의 첫번째 요소가 (타카하시의 강함 / X)보다 작으면 poll하여 인접 요소를 우선 순위 큐에 넣는다.2번을 될 수 있는 한 진행한 후 결과를 출력한다.
TreeMap을 사용하여 산타가 이동한 라인을 저장한다. (가로 이동은 rowLine, 세로 이동은 colLine) houseList를 순회하며 산타가 이동한 라인에 포함되어 있는지 확인한다.
색깔이 주어진 점들을 X, Y좌표로 오름차순 정렬한다.정렬된 점들을 순회하며 흰색 점이 검정색 점보다 X or Y좌표가 앞서있는 것이 하나라도 있는지 확인한다.
h, w, d(가로, 세로 방향)를 고려하며 bfs로 최소 횟수를 구한다.