목록스택 (3)
레야몬
1. 문제 두 사람 A, B가 서로 볼 수 있으려면, 두 사람 사이에 A 또는 B보다 키가 큰 사람이 없어야 한다. 줄에 서 있는 사람의 키가 주어질 때, 서로 볼 수 있는 쌍의 수를 구하는 프로그램을 작성하시오 - 1 - 기다리는 사람의 수 \(N(1 \leq N \leq 500,000)\) - N개의 줄 - 키 \(height(1 \leq height \leq 2^{31})\) 서로 볼 수 있는 사람의 수 2. 재정의 수열이 주어질 때 두 수 사이에 있는 값이 더 작거나 같은 두 수의 순서쌍의 개수를 구하라 3. 해결 방법 순차적으로 같거나 내려갈 경우 스택에 추가 올라갈 경우 스택에 있는 키를 꺼내는데 같은 키의 개수를 구하자 같은 키의 개수를 더하고 스택에 더 있으면 한 번 더 더하자. 같은 키C..
#include #include #include #include #define FOR(i, k, N) for(int i=k; i> N; FOR(i, 1, N) cin >> hei[i]; } ll init(ll s, ll e, ll no) { if(s==e) return tr[no]=s; //단말 노드는 자기 자신 ll m = (s+e)/2; int lid = init(s, m, no*2), rid = init(m+1, e, no*2+1); return tr[no] = hei[lid]>hei[rid] ? rid:lid; //둘로 나누기 } int sum(ll s, ll e, ll no, ll l, ll r) { if(l>e || r
#include #include using namespace std; stack st; //수식을 저장할 스택 char ms; //수학 기호: mathematical symbol char me[101]; //수식: mathematical expression char ms_tmp; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> me; for(int i=0; me[i]; i++) { ms=me[i]; switch(ms) { case '+': case '-': while(!st.empty() && (ms_tmp=st.top())!='(') { //스택이 비거나 ')'를 만날 때 까지 cout