algorithm/Algorithm-Core 23

LIS - Array List로 구하기

www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 증가하는 부분수열을의 개수를 구하는 문제이다. 그동안 DP나 TreeSet.ceiling 을 이용해서 구했는데.. ArrayList를 이용해서 구하면 많이 바르다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.C..

Binary Indexed Tree Range Update

기본적인 BIT(Binary Index Tree : 펜윜트리) 는 빠르게 값을 변경하고, 누적합을 찾을때 사용되는 알고리즘 이다. 하지만, 순차 광역 .. 예를 들어 [a~b] 까지 값을 v 만큼 더해준다... 이런건 어떻게 할까? 이 알고리즘이 바로 Binary Indexed Tree Range Update 임. [참조 : 기타 Index tree 관련 설명은 아래 참조 ] https://medium.com/@harekrishnamahto18/range-sum-and-update-in-arrays-competitive-programming-82ae5039a16f Range Update에 대한 부분은 아래 상세 내용 참조 https://kartikkukreja.wordpress.com/2013/12/02..

절단선 찾기 vs 싸이클 찾기

절단점 찾는 알고리즘과 싸이클 찾은 알고리즘은 둘다 DFS방식을 이용하지만, 미묘하게 다르다..뭐가 다를까?. 절단선 = 단절선. (Bridge : 단절선) int dfs(int A, int parent) : A와 A의 자식 노드가 A에서 parent노드로 가는 간선을 사용하지 않고 도달할 수 있는 정점 중 가장 먼저 dfs함수가 방문한 정점을 반환한다. static int dfs(int s, int p, int d) { // start, parent, depth D[s]=d; int ck = d; for (Object des : list[s]) { Node nd = (Node)des; if(nd.e==p) continue; if(D[nd.e]==0) { int re = dfs(nd.e, s, d+1);..