fence 문제 상호 배타적 집합 해결책 오답 질문

  • jongyeop.lee
    jongyeop.lee

    fence 문제 상호 배타적 집합 해결책으로 풀어 보았습니다.
    유니온-파인드 자료구조는 조금 수정하여 사용하였습니다.
    algospot에 나와있는 예제는 모두 정답으로 나오는데
    왜 오답으로 나오는지 모르겠네요.
    고수님들 도와 주세요 ㅠㅜ

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int n;
    int h[20001];
    
    struct NaiveDisjointSet {
        vector<int> parent, counts;
        NaiveDisjointSet(int n) : parent(n, -1), counts(n, 0) {}
        int find(int u) {
            if (u == parent[u]) return u;
            if (u < 0 || u > n - 1 || parent[u] == -1) return -1;
            return parent[u] = find(parent[u]);
        }
        int merge(int u, int v) {
            u = find(u);
            v = find(v);
            if (u == -1) return counts[v];
            if (v == -1) return counts[u];
            if (u == v) return counts[u];
            if (u < v) swap(u, v);
            parent[u] = v;
            return counts[v] += counts[u];
        }
        void add(int u) {
            if (find(u) == -1) {
                parent[u] = u;
                counts[u] = 1;
            }
        }
    };
    
    int solve2(vector<pair<int, int> >& order) {
        NaiveDisjointSet sets(n);
        int ret = 0;
    
        for (int i = 0; i < order.size(); ++i) {
            int idx = order[i].second;
            sets.add(idx);
    
            int left = sets.find(idx - 1);
            int right = sets.find(idx + 1);
            ret = max(ret, h[idx] * sets.merge(idx, idx - 1));
            ret = max(ret, h[idx] * sets.merge(idx + 1, idx));
        }
    
        return ret;
    }
    
    bool myfunction(const pair<int, int>& a, const pair<int, int>& b) {
        return a.first > b.first;
    }
    
    int main()
    {
        int numOfCase;
        cin >> numOfCase;
    
        while(numOfCase) {
            cin >> n;
            for (int i = 0; i < n; ++i) cin >> h[i];
    
            vector<pair<int, int> > order;
            for (int i = 0; i < n; ++i) order.push_back(make_pair(h[i], i));
            sort(order.begin(), order.end(), myfunction);
    
            cout << solve2(order) << endl;
            --numOfCase;
        }
    
        return 0;
    }
    

    8년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.