문제
https://www.acmicpc.net/problem/2493
풀이설명
처음에는 n^2 풀이가 생각이 났다 -> 당연히 안된다 50만이니
투포인터, 스택, 등등 생각해보다가 우큐의 힌트를 받아서 돌진했다.
현재 어떤 위치에 값을 보고있는데 아직 배정되지 않은 번호들이 있을 경우 현재 값이 배정되지않은 값보다 크면 배정을 해준다
if (!pq.empty() &&arr[i] > pq.top().first) { while (!pq.empty() && arr[i] > -pq.top().first) { //cout << arr[i] << " " << -pq.top().first << " " << pq.top().second << endl; ans[pq.top().second] = i; pq.pop(); } pq.push({ -arr[i], i }); }
위에서 자꾸 실수한점은 우큐는 맥스힙으로 되니 따로 정렬하기 싫어서 -로 넣었는데 , 이때 꺼낼때는 -를 붙어서 나와야하는데 그것을 인식하지 않아서 자꾸 틀리게 되었다.
while로 돌려야한다 왜냐? 배정되지않고 남아 있는 것들을 현재 위치로 레이저를 발사할 수 있다면 다 발사 해야하기때문에.
소스
#include <bits/stdc++.h>
using namespace std;
int arr[600000];
int ans[600000];
int n;
priority_queue < pair<int, int>, vector<pair<int, int>>> pq; // 값, 해당 위치 번호 인덱스 (1- base)
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
for (int i = n; i >= 1; i--) {
if (!pq.empty() &&arr[i] > pq.top().first) {
while (!pq.empty() && arr[i] > -pq.top().first) {
//cout << arr[i] << " " << -pq.top().first << " " << pq.top().second << endl;
ans[pq.top().second] = i;
pq.pop();
}
pq.push({ -arr[i], i });
}
else {
pq.push({ -arr[i],i });
}
}
for (int i = 1; i <= n; i++) cout << ans[i] << " ";
}
'알고리즘' 카테고리의 다른 글
조합 문제. 중복조합 (0) | 2021.11.29 |
---|---|
백준 가장 긴 바이토닉 부분 수열 11054번 (0) | 2021.11.25 |
격자위의 사각형갯수 구하는 수학 (1) | 2021.11.22 |
최장증가수열 1편 가장 기초 (역추적 x), 백준 가장 긴 증가하는 부분 수열 (0) | 2021.11.19 |
백준 IPv6 , 3107번 (0) | 2021.11.19 |