KBODRAFT 질문 드립니다.

  • shinhj88
    shinhj88

    KBODRAFT문제를 풀었는데 답이 나오지 않아 질문 드립니다.
    저는 이문제를 멀티 셋을 이용하여 풀었습니다.
    처음에 연속되는 K구간을 잡고 각 포지션의 능렬치의 최대값을 저장 해 나갔는데
    이때 비트를 이용하여 만약 처음 들어오는 포지션이라면 그 능력치의 값을 저장하고 비트를 켰스니다. 그리고 그값을 이진 트리에 저장 하였습니다.
    그리고 만약 중복되는 포지션의 선수가 들어오면 이미 전에 더해진 값과 비교를 합니다. 이때 이값이 이전에 더해진 값보다 더 큰 값이라면이전에 더해진 값을 빼서 그 차이를 전체 값에 더합니다.
    그리고 이젠 현재 검사되어질 선수가 K개 이상이면 이전에 검사된 선수중 맨 첫번째 선수를 제거 합니다.
    만약에 제거 되어질 선수의 능력치가 가장 큰 값이라면 그값을 빼고 트리를 갱신하고 갱신된 트리에서 가장 큰 값을 찾아 더합니다.
    만약 이때 더이상 트리에 값이 존재하지 않을 경우 해당 포지션의 비트를 0으로 만듭니다.
    그리고 제거될 선수가 전제값에 영향을 못미치면 그냥 단순히 트리에서 제거합니다.
    이과정을 반복하고, 만약 비트가 다켜져 있다면 그값들중에 최대값을 출력합니다.
    제가 접근한 방법은 여기 까지고요 글쓰는게 서툴러서 제대로 이해 전달했는지 모르겠습니다.ㅜㅜㅜㅜ
    제가 어디가 틀려서 오답을 받았는지 도와주시면 감사하겠습니다 ㅜㅜㅜㅜ
    밑에는 제 소스입니다.

    #include <cstdio>
    #include <vector>
    #include <set>
    using namespace std;
    const int MAX_V = 100001;
    int a[MAX_V][2];
    void solve()
    {
            int n,m;
            multiset<int> mt[9];
            scanf("%d%d",&n,&m);
            int sum = 0,ans = 0,bit = 0;
            int value ,idx, added;
            for(int i = 0; i < n; i++)
            {
                    scanf("%d%d",&a[i][0],&a[i][1]);
                    a[i][0] --;
                    if(i - m >= 0)
                    {
                            value = a[i - m][1];
                            idx = a[i - m][0];
                            added = *(mt[idx].begin()) * -1;
                            if(added == value)
                            {
                                    sum -= added;
                                    mt[idx].erase(-added);
                                    if(mt[idx].begin() != mt[idx].end())
                                    {
                                            added = *(mt[idx].begin()) * -1;
                                            sum += added;
                                    }
                                    else bit -= (1 << idx); 
                            }
                            else mt[idx].erase(-added);
                    }
                    idx = a[i][0];
                    if(mt[idx].begin() == mt[idx].end())
                    {
                            sum += a[i][1];
                            bit |= (1 << idx);
                    }
                    else{
                            added = *(mt[idx].begin()) * -1;
                            if(added < a[i][1])
                            {
                                    sum += a[i][1] - added;
                            }
                    }
                    mt[idx].insert(-a[i][1]);
                    if(bit == (1 << 9) - 1)ans = max(ans,sum);
            }
            printf("%d\n",ans);
    }
    int main()
    {
            int T;
            scanf("%d",&T);
            while(T--)
            {
    
                    solve();
            }
            return 0;
    }
    


    9년 전
4개의 댓글이 있습니다.
  • Kureyo
    Kureyo

    multiset에서 value로 erase하는 것은 해당되는 모든 value들을 삭제해버립니다. 그것이 문제가 되지않을까하네요.


    9년 전 link
  • shinhj88
    shinhj88

    답변 감사 드립니다.
    답변해 주신 데로 erase에서 value 값을 삭제하는대힌 iterator 를 이용해서 삭제 하였는데도 답이 나오지 않습니다. ㅜㅜ


    9년 전 link
  • berebere86
    berebere86

    아래 input 한번 넣어보세요 :)
    1
    11 9
    8 3
    8 5
    1 1
    2 1
    3 1
    4 1
    5 1
    6 1
    7 1
    8 1
    9 1


    9년 전 link
  • shinhj88
    shinhj88

    ㅜㅜㅜㅜㅜㅜㅜㅜ 감사합니다.
    이런 바보같은 질문을......


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