Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코딩
- 16202
- 호반우 상인
- hcpc
- 쌤쌤쌤
- 줄어드는수
- 사이클 없는 그래프
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- graph #최단경로
- backtracking #codetree #디버깅 #삼성코테
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- LIS #가장긴증가하는부분수열 #
- 투포인터 #백준 #boj #20922 #22862
- 22869
- 레드아보
- 20117
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
- graph
- 3343
- N번째큰수
- 백준 #다익스트라 #dijkstra #9370 #c++
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- 1174
- boj #백준
- 이분탐색 #dp #11053
- BOJ
- 백준
- c++ #boj #
- C++
- 30870
Archives
- Today
- Total
hyunjin
[C++][BOJ 7662 이중 우선순위 큐] multiset 본문
728x90
문제를 읽고 priority_queue 오름차순, 내림차순 2개를 사용해서 풀었으나 고려해야할 부분이 더 생겼고 결국 틀렸다.
priority_queue 처럼 자동으로 정렬되면서 대신 앞 뒤 두 방향으로 다 접근 가능한 container가 set이라는 것을 찾았다.
그런데 set은 중복이 허용되지 않고 중복이 허용되는 것은 multiset이었다.
헤더파일 : #include <set>
multiset은 기본으로 오름차순 정렬된다.
[소스 코드] multiset 사용
// multiset 사용법
#include <iostream>
#include <string>
#include <set>
using namespace std;
typedef long long ll;
void Solve(){
int testCase;
cin>>testCase;
while(testCase--){
int k;cin>>k;
multiset<ll> ms;
for(int i = 0 ; i < k ;i++){
char c; ll num;
cin>>c>>num;
switch(c){
case 'I':{
ms.insert(num);
break;
}
case 'D':{
if(!ms.size()) break;
if(num==1){
ms.erase(--ms.end());
}
else{
ms.erase(ms.begin());
}
break;
}
}
}
if( ms.size()) cout<< *(--ms.end() )<<" " << *ms.begin()<<"\n";
else cout<<"EMPTY\n";
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
Solve();
}
[틀린 코드] priority_queue 2개 사용
#include <iostream>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
enum ActionType{
I,D,
};
void Solve(){
int testCase;
cin>>testCase;
while(testCase--){
int k;cin>>k;
int cnt = 0;//전체 원소 개수
int cnt_delete = 0;//실제 D 연산 수
priority_queue<ll> Q1;
priority_queue<ll,vector<ll>,greater<ll>> Q2;
for(int i = 0 ; i < k ;i++){
ActionType actionType;
char c; ll num;
cin>>c>>num;
actionType = c=='I'?I:D;
switch(actionType){
case I:{
Q1.push(num);
Q2.push(num);
cnt++;
break;
}
case D:{
if(cnt >= cnt_delete+1){
if(num==1){
Q1.pop();
}
else{
Q2.pop();
}
cnt_delete++;
}
break;
}
}
}
if( Q1.size()+Q2.size()-cnt <= 0) cout<<"ENPTY\n";
else{
cout<< Q1.top()<<" "<<Q2.top()<<"\n";
}
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
Solve();
}
728x90
'알고리즘 연습 > 백준' 카테고리의 다른 글
[가장 긴 증가하는 부분 수열] LIS, DP, 이분탐색 (0) | 2024.04.19 |
---|---|
[BOJ 15663/15664 c++]N과 M, set, backtracking (0) | 2022.10.01 |
[C++][BOJ 1629 곱셈] pow 연산 줄이기 (0) | 2021.12.06 |
[C++][BOJ 2170 선긋기] (0) | 2021.09.09 |
[C++][BOJ 1174 줄어드는 수] (0) | 2021.09.09 |