https://www.acmicpc.net/problem/2143
A배열의 연속 합 + B배열의 연속 합의 조합을 찾는 문제입니다.
A와 B 배열 각각의 연속합을 모두 저장한 후 이분탐색으로 사용하였습니다.
Alist의 값과 더할 Blist의 값을 이분탐색으로 찾아야하는데 중복된 값이 들어있을 수 있으므로 upper bound와 lower bound를 이용해야합니다.
C++에는 upper_bound와 lower_bound가 지원되어 편리하지만 JAVA에는 없어서..
직접구현 해본적도 없는 얘내들 구현한다고 고생좀 했습니다 ㅠㅠ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.StringTokenizer; public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static int A[], B[], Adp[], Bdp[]; static ArrayList<Long> Alist, Blist; static int N, M; static long T, ans; static void init() { Alist = new ArrayList<>(); Blist = new ArrayList<>(); for (int i = 1; i <= N; i++) { for (int j = i; j <= N; j++) { Alist.add((long) (Adp[j] - Adp[i - 1])); } } for (int i = 1; i <= M; i++) { for (int j = i; j <= M; j++) { Blist.add((long) (Bdp[j] - Bdp[i - 1])); } } Collections.sort(Alist); Collections.sort(Blist); } static long upperbound(int l, int r, long x) { r++; while (l < r) { int m = (l + r) / 2; if (Blist.get(m) <= x) l = m + 1; else r = m; } return l; } static long lowerbound(int l, int r, long x) { r++; while (l < r) { int m = (l + r) / 2; if (Blist.get(m) < x) l = m + 1; else r = m; } return r; } static void binarysearch(int l, int r, long x) { if (l > r) return; int m = (l + r) / 2; long sum = x + Blist.get(m); if (sum == T) { ans += (upperbound(0, Blist.size() - 1, Blist.get(m)) - lowerbound(0, Blist.size() - 1, Blist.get(m))); return; } else if (sum > T) binarysearch(l, m - 1, x); else binarysearch(m + 1, r, x); } static void func() { for (int i = 0; i < Alist.size(); i++) { binarysearch(0, Blist.size() - 1, Alist.get(i)); } } static void input() throws Exception { st = new StringTokenizer(br.readLine()); T = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); A = new int[N + 1]; Adp = new int[N + 1]; st = new StringTokenizer(br.readLine()); for (int i = 1; i <= N; i++) { A[i] = Integer.parseInt(st.nextToken()); Adp[i] = Adp[i - 1] + A[i]; } st = new StringTokenizer(br.readLine()); M = Integer.parseInt(st.nextToken()); B = new int[M + 1]; Bdp = new int[M + 1]; st = new StringTokenizer(br.readLine()); for (int i = 1; i <= M; i++) { B[i] = Integer.parseInt(st.nextToken()); Bdp[i] = Bdp[i - 1] + B[i]; } } public static void main(String[] args) throws Exception { input(); init(); func(); System.out.println(ans); } } | cs |
'algorithm > binarysearch' 카테고리의 다른 글
boj 2110 공유기 설치 (0) | 2021.04.13 |
---|---|
boj 7453 합이 0인 네 정수 (0) | 2021.01.22 |
boj 2805 나무 자르기 (0) | 2021.01.22 |
boj 1920 수 찾기 (0) | 2021.01.22 |
boj 17124 두 개의 배열 (0) | 2021.01.22 |