제출 #779133

#제출 시각아이디문제언어결과실행 시간메모리
779133fatemetmhr벽 (IOI14_wall)C++17
100 / 100
859 ms97112 KiB
//  ~ Be Name Khoda ~  //

#include "wall.h"
#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC target("avx2")
//#pragma GCC optimize("unroll-loops,Ofast")

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second

const int maxn  =  8e6   + 10;
const int maxn5 =  2e6   + 10;
const int maxnt =  8e6   + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   + 7;
const ll  inf   =  1e18;

void upd(int, int, int, int, int, int, int);

int ret[maxn5], segl[maxnt], segr[maxnt];

void shift(int l, int mid, int r, int v){
    upd(l, mid, l, mid, 1, segl[v], v * 2);
    upd(l, mid, l, mid, 2, segr[v], v * 2);
    upd(mid, r, mid, r, 1, segl[v], v * 2 + 1);
    upd(mid, r, mid, r, 2, segr[v], v * 2 + 1);
    segl[v] = 0;
    segr[v] = mod;
}

void upd(int l, int r, int lq, int rq, int ty, int k, int v){
    if(rq <= l || r <= lq)
        return;
    if(lq <= l && r <= rq){
        if(ty == 1){
            segl[v] = max(segl[v], k);
            segr[v] = max(segr[v], segl[v]);
        }
        else{
            segr[v] = min(segr[v], k);
            segl[v] = min(segl[v], segr[v]);
        }
        return;
    }
    int mid = (l + r) >> 1; shift(l, mid, r, v);
    upd(l, mid, lq, rq, ty, k, v * 2);
    upd(mid, r, lq, rq, ty, k, v * 2 + 1);
}

void shift_all(int l, int r, int v){
    if(r - l == 1){
        ret[l] = segl[v];
        return;
    }
    int mid = (l + r) >> 1;
    shift(l, mid, r, v);
    shift_all(l, mid, v * 2);
    shift_all(mid, r, v * 2 + 1);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    fill(segl, segl + maxnt, 0);
    fill(segr, segr + maxnt, mod);
    for(int i = 0; i < k; i++)
        upd(0, n, left[i], right[i] + 1, op[i], height[i], 1);
    shift_all(0, n, 1);
    for(int i = 0; i < n; i++)
        finalHeight[i] = ret[i];
    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...