※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 30512번 문제인 조용히 완전히 영원히이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/30512
글쓴이는 이 문제를 쿼리를
이 과정에서 각
한편, 이와 같은 쿼리 중 해당 수에 마지막으로 유의미하게 적용되었을 수 있는 쿼리는 (1) 적용하고자 하는
위와 같은 쿼리의 추가, 제거 및 탐색은 우선순위 큐(Priority Queue)를 이용해 어렵지 않게 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
using namespace std;
int N, Q;
int A[100001];
priority_queue<pair<pair<int, int>, pair<int, int>>> pq;
priority_queue<pair<pair<int, int>, int>> pq2;
int ans[100001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 1; i <= N; i++) cin >> A[i];
cin >> Q;
for (int q = 1; q <= Q; q++) {
int L, R, V; cin >> L >> R >> V;
pq.push(make_pair(make_pair(-L, R), make_pair(V, q)));
}
for (int i = 1; i <= N; i++) {
while (!pq.empty() && pq.top().first.first == -i) {
pq2.push(make_pair(make_pair(-pq.top().second.first, -pq.top().second.second), pq.top().first.second));
pq.pop();
}
while (!pq2.empty() && pq2.top().second < i) pq2.pop();
if (!pq2.empty()) {
if (-pq2.top().first.first < A[i]) ans[-pq2.top().first.second]++, A[i] = -pq2.top().first.first;
else ans[0]++;
}
else ans[0]++;
}
for (int i = 1; i <= N; i++) cout << A[i] << ' ';
cout << '\n';
for (int i = 1; i <= Q; i++) {
ans[i] += ans[i - 1];
cout << ans[i] << ' ';
}
}
'BOJ' 카테고리의 다른 글
[BOJ 11541 // C++] At most twice (1) | 2024.07.17 |
---|---|
[BOJ 27730 // C++] 견우와 직녀 (1) | 2024.07.16 |
[BOJ 13473 // C++] Anniversary Cake (1) | 2024.07.14 |
[BOJ 11268 // C++] Bell Ringing (0) | 2024.07.13 |
[BOJ 14595 // C++] 동방 프로젝트 (Large) (0) | 2024.07.12 |