제출 #24874

#제출 시각아이디문제언어결과실행 시간메모리
24874evenharder역사적 조사 (JOI14_historical)C++11
40 / 100
4000 ms15560 KiB
#include <cstdio>
#include <set>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>
#include <cmath>
#include <functional>

struct query{
    int l,r,n;
    long long int ans;
    query(int l=0, int r=0, int n=0) : l(l), r(r), n(n) {ans=0LL;}
};

std::map<int, long long int> m; // amount
std::multiset<long long int, std::greater<long long int> > s;
std::vector<query> vq;
const int MAX_N=100000;
int x[MAX_N+1];
int n,q;
void calc()
{
    int sq=(int)(ceil(sqrt(n+1)));
    std::sort(vq.begin(), vq.end(), [&] (query A, query B) {
        return A.l/sq == B.l/sq ? A.r < B.r : A.l < B.l;
    });

    int l=1;
    int r=0;
    for(int i=0;i<n;i++) s.insert(0);

    for(int i=0;i<q;i++)
    {
        while(r<vq[i].r)
        {
            r++;
            long long int prev = m[x[r]] * x[r];
            auto it = s.find(prev);
            s.erase(it);
            m[x[r]]++;
            s.insert(prev+x[r]);
        }
        while(r>vq[i].r)
        {
            long long int prev = m[x[r]] * x[r];
            auto it = s.find(prev);
            s.erase(it);
            m[x[r]]--;
            s.insert(prev-x[r]);
            r--;
        }
        while(l<vq[i].l)
        {
            long long int prev = m[x[l]] * x[l];
            auto it = s.find(prev);
            s.erase(it);
            m[x[l]]--;
            s.insert(prev-x[l]);
            l++;
        }
        while(l>vq[i].l)
        {
            l--;
            long long int prev = m[x[l]] * x[l];
            auto it = s.find(prev);
            s.erase(it);
            m[x[l]]++;
            s.insert(prev+x[l]);
        }
        vq[i].ans=*s.begin();
    }

    std::sort(vq.begin(), vq.end(), [&] (query A, query B) {
        return A.n < B.n;
    });

    for(int i=0;i<q;i++) printf("%lld\n", vq[i].ans);
}
int main()
{

    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x[i]);
    }
    for(int i=0;i<q;i++)
    {
        static int l,r;
        scanf("%d%d",&l,&r);
        vq.push_back(query(l,r,i));
    }

    calc();
}

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

historic.cpp: In function 'int main()':
historic.cpp:83:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&q);
                        ^
historic.cpp:86:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&x[i]);
                          ^
historic.cpp:91:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&l,&r);
                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...