처음 보는 느낌의 segment tree 문제이다 재미있었다.

풀이
기본적인 segmet tree를 n+m개의 leaf node가 존재하게 선언한다.
처음에는 뒤의 n개 노드에만 1을 표시에 넣어준다
입력을 받을 때마다 새로운 id를 부여해주고 segment tree의 기존 위치에는 -1을 새 위치에는 1을 update 해준다
m이 충분히 작아서 여유공간을 만들어주고 활용할 수 있다는 점이 인상적인 문제이다.
시간 복잡도 : O(mlog(n+m))
소요 시간 : 측정 불가
아쉬운 점
앞으로 맞이하게 될 문제들에 다양한 종류의 segment tree가 많을 건데 이번 문제에서는 처음 보는 형태라고 잘 알아차리지 못해 아쉽다.
전체적인 감상
구현에 직관적이고 흥미로운 아이디어들이 사용되어 재미있는 문제라고 생각한다.
/* basic setup {{{ */ #include<bits/stdc++.h> #define ff first #define ss second #define pb push_back #define sz(x) ((int)x.size()) #define all(x) x.begin(),x.end() #define compress(x) sort(all(x)), x.erase(unique(all(x)), x.end()) #define fast_io ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef const int ci; const int MOD = 1e9+7; const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3f; /*}}}*/ ci BN = 200010; int seg[BN*4], n, m, nidx[BN], f; int sum(int node, int s, int e, int l, int r){ if(r < s || e < l) return 0; if(l <= s && e <= r) return seg[node]; int m = (s+e)>>1; return sum(node*2, s, m, l, r) + sum(node*2+1, m+1, e, l, r); } void upd(int node, int s, int e, int tar, int val){ if(tar < s || e < tar) return; seg[node] += val; if(s == e) return; int m = (s+e)>>1; upd(node*2, s, m, tar, val); upd(node*2+1, m+1, e, tar, val); } void init(){ memset(nidx, 0, sizeof nidx); memset(seg, 0, sizeof seg); for(int i=1;i<=n;i++) nidx[i] = m+i; } void solve(){ cin>>n>>m; init(); for(int i=1;i<=n;i++) upd(1, 1, n+m, nidx[i], 1); for(int i=0;i<m;i++){ cin>>f; cout<<sum(1, 1, n+m, 1, nidx[f]-1)<<' '; upd(1, 1, n+m, nidx[f], -1); nidx[f] = m-i; upd(1, 1, n+m, m-i, 1); } cout<<'\n'; } int main(){ fast_io; int t; cin>>t; while(t--){ solve(); } }
'백준 문제 해설' 카테고리의 다른 글
5789 한다 안한다 (C++) (0) | 2022.10.13 |
---|---|
25191 치킨댄스를 추는 곰곰이를 본 임스 (C++) (0) | 2022.10.12 |
1743 음식물 피하기 (C++) (0) | 2022.10.11 |
2670 연속부분최대곱 (C++) (1) | 2022.10.10 |
13241 최소공배수 (C++) (0) | 2022.10.08 |
7578 공장 (C++) (0) | 2022.10.07 |
5856 Party Invitations (C++) (0) | 2022.10.06 |
2162 선분 그룹 (C++) (0) | 2022.10.05 |