Submission #337734

#TimeUsernameProblemLanguageResultExecution timeMemory
337734blueWall (IOI14_wall)C++11
100 / 100
1394 ms183020 KiB
#include "wall.h"
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

//Maintain a set of updates, update it at left and right points of every update
//Sort the updates by index
//Segtree over update indices
//
// void q(int i)
// {
//     cout << i << '\n';
// }

struct segtree
{
    int l;
    int r;

    int mn;
    int mx;

    segtree* left;
    segtree* right;

    segtree();

    segtree(int L, int R);

    void enable(int i, int op, int height);

    void disable(int i);

    int rangemin(int L, int R);

    int rangemax(int L, int R);

    void printmax();

    void printmin();

    int binary_search(int suffixMin, int suffixMax);
};

vector<int> enable[2000000];
vector<int> disable[2000000];

segtree V[1000000];
int vcount = -1;

segtree::segtree()
{
    mn = 1e5 + 1;
    mx = 0;
}

segtree::segtree(int L, int R)
{
    l = L;
    r = R;

    mn = 1e5 + 1;
    mx = 0;

    if(l == r) return;
    int m = (l+r+2)/2 - 1; //for -1
    vcount++;
    left = &V[vcount];
    *left = segtree(l, m);
    vcount++;
    right = &V[vcount];
    *right = segtree(m+1, r);
}

void segtree::enable(int i, int op, int height)
{
    if(i < l || r < i) return;

    if(op == 1)
    {
        if(l == r) mx = height;
        else
        {
            left->enable(i, 1, height);
            right->enable(i, 1, height);

            mx = max(left->mx, right->mx);
        }
    }
    else
    {
        if(l == r) mn = height;
        else
        {
            left->enable(i, 2, height);
            right->enable(i, 2, height);

            mn = min(left->mn, right->mn);
        }
    }
}

void segtree::disable(int i)
{
    if(i < l || r < i) return;

    if(l == r)
    {
        mn = 1e5+1;
        mx = 0;
    }
    else
    {
        left->disable(i);
        right->disable(i);

        mx = max(left->mx, right->mx);
        mn = min(left->mn, right->mn);
    }
}

int segtree::rangemin(int L, int R)
{
    if(R < l || r < L) return 1e5+1;
    if(L <= l && r <= R)
    {
        return mn;
    }
    return min(left->rangemin(L, R), right->rangemin(L, R));
}

int segtree::rangemax(int L, int R)
{
    if(R < l || r < L) return 0;
    if(L <= l && r <= R) return mx;
    return max(left->rangemax(L, R), right->rangemax(L, R));
}

void segtree::printmax()
{
    if(left == NULL) cout << mx << ' ';
    else
    {
        left->printmax();
        right->printmax();
    }
}

void segtree::printmin()
{
    if(left == NULL) cout << mn << ' ';
    else
    {
        left->printmin();
        right->printmin();
    }
}

int segtree::binary_search(int suffixMin = 1e5+1, int suffixMax = 0) {
    // cout << "search " << a << ' ' << b << '\n';
    if(l == r)
    {
        if (mn == 1e5+1)
            return min(suffixMin, mn);
        else
            return max(suffixMax, mx);
    }
    int m = (l+r+2)/2-1;
    if (min(suffixMin, right->mn) <= max(suffixMax, right->mx))
        return right->binary_search(suffixMin, suffixMax);
    else
        return left->binary_search(
            min(suffixMin, right->mn), max(suffixMax, right->mx));
}


segtree* T;
int N;
int K;

                            //1 = max, 2 = min
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
    N = n;
    K = k;
    segtree S(-1, k-1);
    S.enable(-1, 2, 0);

    T = &S;

    for(int j = 0; j < k; j++)
    {
        enable[left[j]].push_back(j);
        disable[right[j]].push_back(j);
    }

    int temp = 0;

    for(int i = 0; i < n; i++)
    {
        // cout << "i = " << i << '\n';


        for(int j: enable[i])
        {
            S.enable(j, op[j], height[j]);
            // cout << "enable " << j << '\n';

            // S.printmax();
            // cout << '\n';
            // S.printmin();
            // cout << '\n';

        }
        if(enable[i].size() != 0 || (i > 0 && disable[i-1].size() != 0))
        {

            temp = T->binary_search();
            // cout << temp << '\n';
            // cout << "\n\n\n";
        }
        for(int j: disable[i])
        {
             S.disable(j);
            // cout << "disable " << j << '\n';

            // S.printmax();
            // cout << '\n';
            // S.printmin();
            // cout << "\n\n\n";

        }

        finalHeight[i] = temp;
    }
}

Compilation message (stderr)

wall.cpp: In member function 'int segtree::binary_search(int, int)':
wall.cpp:169:9: warning: unused variable 'm' [-Wunused-variable]
  169 |     int m = (l+r+2)/2-1;
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...