Skip to main content
  1. Posts/
  2. Algorithm/

BOJ 5916 농장 관리

·160 words·1 min
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 트리가 주어진다.
    • 두 정점 사이 경로에 1을 더한다.
    • 두 정점 사이 경로의 가중치의 합을 계산한다.
  • 나이브하게는 $O(QN)$이겠지만, HLD와 Lazy 세그먼트 트리를 이용해서 $O(Qlog^2N)$정도에 계산할 수 있을 것 같다.

💻 풀이
#

  • 코드 (C++):
void solve(){
    int N, M; cin >> N >> M;
    Tree tree(N);
    rep(i, 0, N-1){
        int u, v; cin >> u >> v;
        tree.add_edge(u, v);
    }
    tree.build();

    LazySegmentTree seg(N+1);
    while(M--){
        char op; cin >> op;
        int u, v; cin >> u >> v;
        if(op == 'P'){
            vector<pii> segs = tree.hld_path(u, v, false, false);
            for(auto [L, R]: segs) seg.update(L, R, 1);
        }
        else{
            ll ans = 0;
            vector<pii> segs = tree.hld_path(u, v, false, false);
            for(auto [L, R]: segs) ans += seg.query(L, R);
            cout << ans << '\n';
        }
    }
}
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다