※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 11626번 문제인 Physical Music이다.
문제는 아래 링크를 확인하자.

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

 

어떤 싱글의 Download Top N차트보다 Single Top N차트의 등수가 더 높다는 것은 이 싱글은 CD Single의 형태로도 구할 수 있음을 지문으로부터 알 수 있다.

 

이를 이용하면, 각 Download Top N 차트의 i위 싱글에 대하여 Download Top N 차트의 i보다 작은 등수의 모든 곡들이 Single Top N 차트에서 더 위에 있는 것은 아니라면 이 싱글은 CD Single의 형태로도 구할 수 있음을 확신할 수 있다.

 

이 점을 활용해 문제를 해결하자. 구간합 segment tree를 활용하면 위 정보를 간단하게 확인할 수 있다.

 

아래는 제출한 소스코드이다.

 

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

int N;
int seg[262145];
void upd(int qI) {
	int L = 1, R = N, sI = 1;
	while (L < R) {
		seg[sI]++;
		int mid = (L + R) / 2;
		if (mid < qI) L = mid + 1, sI = sI * 2 + 1;
		else R = mid, sI = sI * 2;
	}
	seg[sI]++;
}
int qry(int L, int R, int qL, int qR, int sI) {
	if (R < qL || qR < L)return 0;
	if (qL <= L && R <= qR)return seg[sI];
	return qry(L, (L + R) / 2, qL, qR, sI * 2) + qry((L + R) / 2 + 1, R, qL, qR, sI * 2 + 1);
}

vector<int> ans;
void solve() {
	memset(seg, 0, sizeof(seg));
	ans.clear();
	cin >> N;
	for (int i = 1; i <= N; i++) {
		int x; cin >> x;
		if (x > 1 && qry(1, N, 1, x - 1, 1) < x - 1) ans.emplace_back(x);
		upd(x);
	}
	sort(ans.begin(), ans.end());
	cout << ans.size() << '\n';
	for (auto &x : ans) cout << x << '\n';
}

int T;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	while (T--) solve();
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11968 // C++] High Card Wins  (2) 2024.07.10
[BOJ 18866 // C++] 젊은 날의 생이여  (0) 2024.07.09
[BOJ 11255 // C++] ITAI Virus  (0) 2024.07.07
[BOJ 5351 // C++] Coin Row  (0) 2024.07.06
[BOJ 5081 // C++] Constellations  (0) 2024.07.05

+ Recent posts