뜌릅

두 배열의 합 2143번 [백준] 본문

알고리즘/PS 문제

두 배열의 합 2143번 [백준]

TwoCastle9 2021. 12. 24. 09:56
반응형

두 배열의 합 2143번 [백준]

이번에 풀은 문제는 아이디어성 문제 였습니다.

두 배열의 부분합이 t값이 나오면 되는 문제입니다.

 

이 경우 또한 전체탐색으로 t값이 나오는 경우의 수를 찾기에는 시간복잡도를 초과하게 됩니다.

따라서 아이디어의 핵심은 각 배열을 통해 부분합을 모두 저장한 배열을 미리 만들어 두는 겁니다.

 

그 뒤는 부분합 배열을 통해 bianry search을 응용한 함수 upper_bound와 lower_bound을 통해 구하면 되는 간단한 문제였습니다.

 

vector<ll> A;
vector<ll> B;
ll t, n, m, ans = 0;// ll is long long

void solve() {
	cin >> t >> n;
	A = vector<ll>(n);
	for (ll& x : A)cin >> x;

	cin >> m;
	B = vector<ll>(m);
	for (ll& x : B)cin >> x;

	vector<ll> v, w;
	ll sum;

	for (ll i = 0; i < n; i++) {
		sum = A[i];
		v.push_back(sum);
		for (ll j = i+1; j < n; j++) {
			sum += A[j];
			v.push_back(sum);
		}
	}

	for (ll i = 0; i < m; i++) {
		sum = B[i];
		w.push_back(sum);
		for (ll j = i+1; j < m; j++) {
			sum += B[j];
			w.push_back(sum);
		}
	}

	sort(w.begin(), w.end());

	for (ll& x : v) {
		ll diff = t - x;
		auto lb = lower_bound(w.begin(), w.end(), diff);
		auto ub = upper_bound(w.begin(), w.end(), diff);
		ans += (ub - lb);
	}


	cout << ans << endl;
}

https://www.acmicpc.net/problem/2143

반응형

'알고리즘 > PS 문제' 카테고리의 다른 글

Z 1074번 [백준]  (0) 2022.08.26
유기농 배추 1012번 [백준]  (0) 2022.08.25
비숍 1799번 [백준]  (0) 2021.12.23
외판원 순회 2098번 [백준]  (0) 2021.12.22
Subsequence (부분합) 1806번 [백준]  (0) 2021.11.04