제출 #45074

#제출 시각아이디문제언어결과실행 시간메모리
45074RayaBurong25_1Candies (JOI18_candies)C++17
100 / 100
734 ms86316 KiB
#include <stdio.h>
#include <map>
#include <set>
long long A[200005];
std::map<int, long long> V;
std::set<std::pair<long long, int> > PQ;
int cnt[200005];
// bool operator<(std::pair<long long, int> a, std::pair<long long, int> b)
// {
//     return (a.first < b.first || (a.first == b.first && a.second < b.second));
// }
int main()
{
    int N;
    scanf("%d", &N);
    int i;
    for (i = 0; i < N; i++)
    {
        scanf("%lld", &A[i]);
        V.insert({i, A[i]});
        PQ.insert({-A[i], i});
        cnt[i] = 1;
    }
    long long sum = 0, r, diff;
    std::map<int, long long>::iterator p, q;
    std::set<std::pair<long long, int> >::iterator it;
    int s, inc, sumcnt = 0;
    for (i = 1; i <= (N + 1)/2;)
    {
        // for (p = V.begin(); p != V.end(); p++)
            // printf("V %d %lld %d\n", p->first, p->second, cnt[p->first]);
        // for (it = PQ.begin(); it != PQ.end(); it++)
            // printf("PQ %lld %d %d\n", (*it).first, (*it).second, cnt[it->second]);
        r = -PQ.begin()->first;
        s = PQ.begin()->second;
        if (cnt[s] == 0)
            r -= 1e18;
        sum += r;
        sumcnt += cnt[s];
        inc = -cnt[s];
        diff = 0;
        PQ.erase(PQ.begin());
        p = V.find(s);
        if (p != V.begin())
        {
            p--;
            diff += p->second;
            inc += cnt[p->first];
            s = p->first;
            PQ.erase({-p->second, p->first});
            p = V.erase(p);
        }
        diff -= p->second;
        p = V.erase(p);
        if (p != V.end())
        {
            diff += p->second;
            inc += cnt[p->first];
            PQ.erase({-p->second, p->first});
            p = V.erase(p);
        }
        cnt[s] = inc;
        if (inc == 0)
        {
            V.insert({s, diff});
            PQ.insert({1e18 - diff, s});
        }
        else
        {
            V.insert({s, diff});
            PQ.insert({-diff, s});
        }
        // printf("sumcnt %d\n", sumcnt);
        if (sumcnt == i)
        {
            printf("%lld\n", sum);
            i++;
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

candies.cpp: In function 'int main()':
candies.cpp:15:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);
     ~~~~~^~~~~~~~~~
candies.cpp:19:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld", &A[i]);
         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...