제출 #719839

#제출 시각아이디문제언어결과실행 시간메모리
719839ovidiush11벽 (IOI14_wall)C++14
100 / 100
604 ms47048 KiB
#include <bits/stdc++.h>
#include "wall.h"

using namespace std;

#define ff first
#define ss second

const int inf = 1e9;
const int K = 5e5;
const int K1 = 524288;

int amn[2*K1],amx[2*K1];
int pos[K];

void build(int p,int l,int r)
{
    if(l == r)pos[l] = p;
    else
    {
        int m = (l + r) / 2;
        build(p*2,l,m);
        build(p*2+1,m+1,r);
    }
    amn[p] = 0;
    amx[p] = inf;
    return ;
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
    vector<pair<int,int>> vs;
    int id = 0;
    build(1,0,k-1);
    for(int i = 0;i < k;i++)vs.push_back(make_pair(left[i],i));
    for(int i = 0;i < k;i++)vs.push_back(make_pair(right[i]+1,i));
    sort(vs.begin(),vs.end());
    for(int i = 0;i < n;i++)
    {
        while(vs[id].ff == i)
        {
            int v = vs[id].ss;
            id++;
            if(amn[pos[v]] == 0 && amx[pos[v]] == inf)
            {
                if(op[v] == 1)amn[pos[v]] = height[v];
                else amx[pos[v]] = height[v];
            }
            else
            {
                amn[pos[v]] = 0;
                amx[pos[v]] = inf;
            }
            int p = pos[v] / 2;
            while(p != 0)
            {
                int mx = min(amx[p*2],amx[p*2+1]);
                int mn = max(amn[p*2],amn[p*2+1]);
                if(mn > mx)
                {
                    if(mn == amn[p*2+1])mx = mn;
                    else mn = mx;
                }
                amn[p] = mn;
                amx[p] = mx;
                p /= 2;
            }
        }
        finalHeight[i] = amn[1];
    }
    return ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...