자료구조&알고리즘
[알고리즘 연습] 2021년도 10월 넷째주 학습 (D번 문제 풀이)
초코쨔응
2021. 12. 6. 23:08
AtCoder Beginner Contest 223 (D번 문제): topological sort 응용
AtCoder Beginner Contest 223 (F번 문제): segment tree 응용
AtCoder 를 풀다가 공부해두고 싶은 문제가 생겨서 정리해두었다.
1. AtCoder Beginner Contest 223 (D번 문제)
https://atcoder.jp/contests/abc223/tasks/abc223_d
풀이
Indegree 를 활용하는 일반적인 topological sort 코드에 heap push, heap pop 을 추가하기만 하면 된다!
코드
출처: https://atcoder.jp/contests/abc223/submissions/26656807
from heapq import heappush, heappop
N, M = map(int, input().split())
graph = defaultdict(list)
indegree = defaultdict(int)
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
indegree[b] += 1
result = []
q = []
for key in range(1, N+1):
if indegree[key] == 0:
heappush(q, key)
while q:
cur = heappop(q)
result.append(cur)
for item in graph[cur]:
indegree[item] -= 1
if indegree[item] == 0:
heappush(q, item)
if len(result) == N:
print(*result, sep=" ")
else:
print(-1)
2. AtCoder Beginner Contest 223 (F번 문제)
풀이
본 문제는 segment tree 를 이용하는 문제인데, 해설을 정확하게 이해하지 못하였다. 백준의 문자열과 쿼리 시리즈를 공부하고 나서 풀어보면 좋을 듯하다. (거의 동일한 형태의 문제들이다)
코드
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
pair<int, int> op(pair<int, int> a,pair<int, int> b){
return make_pair(min(a.first, a.second + b.first), a.second + b.second);
}
pair<int, int> e(){
return make_pair(0, 0);
}
int main(){
int n, q; cin >> n >> q;
string s; cin >> s;
vector<pair<int, int>> v(n);
for(int i = 0; i < n; i++){
if(s[i] == '(') v[i] = make_pair(0, 1);
else v[i] = make_pair(-1, -1);
}
segtree<pair<int, int>, op, e> seg(v);
for(int i = 0; i < q; i++){
int t, l, r; cin >> t >> l >> r; l--; r--;
if(t == 1){
swap(v[l], v[r]);
seg.set(l, v[l]);
seg.set(r, v[r]);
}
else{
if(seg.prod(l, r + 1) == make_pair(0, 0)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
}