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

 

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

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

 

주어진 모든 수 가운데 주어진 순열의 현재 순서의 수보다 "앞서 나올 수 있는" 수의 개수를 빠르게 접근할 수 있다면 이 문제는 어렵지 않게 해결할 수 있을 것이다.

 

이와 같은 작업은 좌표압축과 세그먼트트리를 이용하여 할 수 있음이 잘 알려져 있지만, pbds(의 rbtree)를 이용하면 (pbds가 무거워서 실행속도는 조금 느리지만) 코드를 빠르게 작성할 수 있다. 이는 코드를 작성하는 속도 대결인 cp에서 유리한 점이라고 생각해 pbds에 익숙해질 겸 pbds로 문제를 해결해보았다.

 

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

#include <iostream>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename K> using ordered_set = tree<K, null_type, less<K>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;

int N;
int A[300000];
ordered_set<int> st;
int fact[300000];
int ans = 1;

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

	cin >> N;
	fact[0] = 1;
	for (int i = 1; i < N; i++) fact[i] = ((ll)fact[i - 1] * i) % 1000000007;
	for (int i = 0; i < N; i++) {
		cin >> A[i];
		st.insert(A[i]);
	}

	for (int i = 0; i < N; i++) {
		int ord = st.order_of_key(A[i]);
		ans = ((ll)ord * fact[N - i - 1] + ans) % 1000000007;
		st.erase(A[i]);
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27503 // C++] 요가 수업  (0) 2024.08.12
[BOJ 12347 // C++] 한수 2  (0) 2024.08.11
[BOJ 13346 // C+] Hamming Ellipses  (0) 2024.08.09
[BOJ 2115 // C++] 갤러리  (0) 2024.08.08
[BOJ 30630 // C++] 직각삼각형의 동생은?  (0) 2024.08.07

+ Recent posts