백준 알고리즘 3770번 : 대한민국

Zoo Da·2021년 12월 8일
0

백준 알고리즘

목록 보기
284/337
post-thumbnail

링크

https://www.acmicpc.net/problem/3770

sol1) FenwickTree + inversion counting

#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define int int64_t
using namespace std;

using pii = pair<int, int>;

template <size_t sz>
struct FenwickTree
{
    vector<int> tree;
    FenwickTree() : tree(sz + 1) {}
    void update(int i, int val)
    {
        for (; i <= sz; i += i & -i)
            tree[i] += val;
    }
    int query(int i)
    {
        int ret = 0;
        for (; i; i -= i & -i)
            ret += tree[i];
        return ret;
    }
};

int32_t main()
{
    fastio;
    int tc;
    cin >> tc;
    for (int i = 1; i <= tc; i++)
    {
        int n, m, k, r = 0;
        cin >> n >> m >> k;
        vector<pii> v(k);
        for (int i = 0; i < k; i++)
            cin >> v[i].first >> v[i].second;
        FenwickTree<1001> FT;
        sort(v.begin(), v.end());
        for (int i = k - 1; i >= 0; i--)
        {
            int t = v[i].second;
            r += FT.query(t - 1);
            FT.update(t, 1);
        }
        cout << "Test case " << i << ": " << r << "\n";
    }
}

전에 풀었던 교차점 개수 세기문제에서 테스트케이스의 개수만 추가해주면 됩니다.
FenwickTree를 사용해서 inversion counting을 할 때에는 앞에서 검사해주어도 되지만 이번엔 뒤에서부터 검사해주었습니다.

profile
메모장 겸 블로그

0개의 댓글