Submission #289157

#TimeUsernameProblemLanguageResultExecution timeMemory
289157stoyan_malininWall (IOI14_wall)C++14
100 / 100
1527 ms201336 KiB
#include "wall.h"
//#include "grader.cpp"

#include <vector>
#include <iostream>

using namespace std;

const int MAXN = 2e6 + 5;

struct Range
{
    int l, r;

    Range(){}
    Range(int l, int r)
    {
        this->l = l;
        this->r = r;
    }

    int f(int x)
    {
        if(x<=l) return l;
        if(x>=r) return r;
        return x;
    }
};

Range Merge(Range first, Range second)
{
    if(second.l>=first.r) return Range(second.l, second.l);
    if(second.r<=first.l) return Range(second.r, second.r);
    if(second.l<=first.l && first.r<=second.r) return Range(first.l, first.r);
    if(first.l<=second.l && second.r<=first.r) return Range(second.l, second.r);
    if(first.l<=second.l && first.r<=second.r && second.l<=first.r) return Range(second.l, first.r);
    if(second.l<=first.l && second.r<=first.r && first.l<=second.r) return Range(first.l, second.r);
}

struct SegmentTree
{
    Range val;

    int l, r;
    SegmentTree *L, *R;

    SegmentTree(){}
    SegmentTree(int l, int r)
    {
        this->val = Range(0, MAXN);
        this->l = l;
        this->r = r;

        this->L = nullptr;
        this->R = nullptr;
    }

    void build()
    {
        if(l==r) return;

        L = new SegmentTree(l, (l+r)/2);
        R = new SegmentTree((l+r)/2+1, r);

        L->build();
        R->build();
    }

    void rem(int q)
    {
        if(l==r && q==l)
        {
            val = Range(0, MAXN);
            return;
        }
        if(q<l || q>r) return;

        L->rem(q);
        R->rem(q);
        val = Merge(L->val, R->val);
    }

    void add(int q, Range newVal)
    {
        if(l==r && q==l)
        {
            val = newVal;
            return;
        }
        if(q<l || q>r) return;

        L->add(q, newVal);
        R->add(q, newVal);
        val = Merge(L->val, R->val);
    }

    void reset()
    {
        //if(val==Range(0, MAXN)) return;
        val = Range(0, MAXN);

        if(L!=nullptr)
        {
            L->reset();
            R->reset();
        }
    }
};

vector <int> toRemove[MAXN], toAdd[MAXN];

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
    SegmentTree *T = new SegmentTree(0, k-1);
    T->build();

    for(int i = 0;i<k;i++)
    {
        toAdd[ left[i] ].push_back(i);
        toRemove[ right[i] ].push_back(i);
    }

    for(int ind = 0;ind<n;ind++)
    {
        if(ind!=0)
        {
            for(int i: toRemove[ind-1])
                T->rem(i);
        }

        for(int i: toAdd[ind])
        {
            if(op[i]==1) T->add(i, Range(height[i], MAXN));//ans = Merge(ans, Range(height[i], MAXN));
            else T->add(i, Range(0, height[i]));//ans = Merge(ans, Range(0, height[i]));
        }

        finalHeight[ind] = T->val.f(0);
    }
}

Compilation message (stderr)

wall.cpp: In function 'Range Merge(Range, Range)':
wall.cpp:38:1: warning: control reaches end of non-void function [-Wreturn-type]
   38 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...