답안 #161062

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
161062 2019-10-31T12:00:39 Z stoyan_malinin Hedgehog Daniyar and Algorithms (IZhO19_sortbooks) C++14
0 / 100
1656 ms 262144 KB
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

const int MAXN = 1e6 + 5;

int n;
int a[MAXN];

int findIndex(vector <int> &v, int x)
{
    if(v[0]>=x) return -1;

    int l = 0, r = v.size() - 1, mid;
    while(l+1<r)
    {
        mid = (l+r)/2;

        if(v[mid]<x) l = mid;
        else r = mid - 1;
    }

    if(v[r]<x) return v[r];
    return v[l];
}

struct node
{
    int maxCost;
    vector <int> v;

    node *L, *R;

    node(){}
    int calcCost(node *A, node *B)
    {
        int ans = max(A->maxCost, B->maxCost);

        int x = findIndex(B->v, A->v.back());
        if(x!=-1) ans = max(ans, x + A->v.back());

        return ans;
    }

    void build(int l, int r)
    {
        if(l==r)
        {
            this->v = vector <int>{a[l]};
            return;
        }

        this->L = new node();
        this->R = new node();

        this->L->build(l, (l+r)/2);
        this->R->build((l+r)/2+1, r);
        this->maxCost = this->calcCost(this->L, this->R);

        for(int x: this->L->v) this->v.push_back(x);
        for(int x: this->R->v) this->v.push_back(x);
        sort(this->v.begin(), this->v.end());
    }

    void query(int l, int r, int ql, int qr, vector <node*> &output)
    {
        if(l>=ql && r<=qr)
        {
            output.push_back(this);
            return;
        }
        if(r<ql || l>qr) return;

        this->L->query(l, (l+r)/2, ql, qr, output);
        this->R->query((l+r)/2, r, ql, qr, output);
    }
};

node *T;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int Q;

    //n = 1000000;
    cin >> n >> Q;
    for(int i = 0;i<n;i++)
    {
        cin >> a[i];
    }

    T = new node();
    T->build(0, n-1);

    vector <node*> v;
    while(Q--)
    {
        int l, r, x;
        cin >> l >> r >> x;
        l--;r--;

        int cost = 0;
        v.clear();T->query(0, n-1, l, r, v);

        int maxElement = -1;
        for(int i = 0;i<v.size();i++)
        {
            cost = max(cost, v[i]->maxCost);
            if(maxElement!=-1)
            {
                int curr = findIndex(v[i]->v, maxElement);
                if(curr!=-1) cost = max(cost, curr + maxElement);
            }

            maxElement = max(maxElement, v[i]->v.back());
        }

        if(cost<=x) cout << "1" << '\n';
        else cout << "0" << '\n';
    }
}
/*
5 2
3 5 1 8 2
1 3 6
2 5 3
*/

Compilation message

sortbooks.cpp: In function 'int main()':
sortbooks.cpp:111:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0;i<v.size();i++)
                       ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1656 ms 262144 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 163 ms 54256 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -