답안 #24875

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
24875 2017-06-16T15:00:10 Z evenharder 역사적 조사 (JOI14_historical) C
컴파일 오류
0 ms 0 KB
#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::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;
int root[MAX_N+1];
long long int cnt[MAX_N+1];
void setRoot()
{
    std::map<int, int> m;
    for(int i=1;i<=n;i++)
    {
        if(m[x[i]]==0)
        {
            root[i]=i;
            m[x[i]]=i;
        }
        else root[i]=m[x[i]];
    }
}
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 = cnt[root[r]] * x[r];
            auto it = s.find(prev);
            s.erase(it);
            cnt[root[r]]++;
            s.insert(prev+x[r]);
        }
        while(r>vq[i].r)
        {
            long long int prev = cnt[root[r]] * x[r];
            auto it = s.find(prev);
            s.erase(it);
            cnt[root[r]]--;
            s.insert(prev-x[r]);
            r--;
        }
        while(l<vq[i].l)
        {
            long long int prev = cnt[root[l]] * x[l];
            auto it = s.find(prev);
            s.erase(it);
            cnt[root[l]]--;
            s.insert(prev-x[l]);
            l++;
        }
        while(l>vq[i].l)
        {
            l--;
            long long int prev = cnt[root[l]] * x[l];
            auto it = s.find(prev);
            s.erase(it);
            cnt[root[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));
    }
    setRoot();
    calc();
}

Compilation message

historic.c:1:18: fatal error: cstdio: No such file or directory
 #include <cstdio>
                  ^
compilation terminated.