답안 #1019432

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1019432 2024-07-10T20:29:33 Z n3rm1n 벽 (IOI14_wall) C++17
0 / 100
120 ms 18444 KB
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int MAXN = 1e5 + 10;

struct node
{
    int minval, maxval, lazy;
    node()
    {
        minval = 0;
        maxval = 0;
        lazy = -1;
    }
};


node t[MAXN * 4];

void push_lazy(int i, int l, int r)
{
    if(t[i].lazy != -1)
    {
        t[i].minval = t[i].lazy;
        t[i].maxval = t[i].lazy;
    }
    if(l != r && t[i].lazy != -1)
    {
        t[2*i].lazy = t[i].lazy;
        t[2*i+1].lazy = t[i].lazy;
    }
    t[i].lazy = -1;
}

int ql, qr, x;
void upd_minimum(int i, int l, int r)
{
    push_lazy(i, l, r);
    if(ql > r || qr < l)return;

    if(t[i].maxval < x)return;
    if(ql <= l && r <= qr)
    {
        //if(t[i].maxval <= x)return;
        if(t[i].minval >= x)
        {
            t[i].lazy = x;
            push_lazy(i, l, r);
            return;
        }
        else return;
    }
    int mid = (l + r)/2;
    upd_minimum(2*i, l, mid);
    upd_minimum(2*i, mid+1, r);

    t[i].minval = min(t[2*i].minval, t[2*i+1].minval);
    t[i].maxval = max(t[2*i].maxval, t[2*i+1].maxval);
}

void upd_maximum(int i, int l, int r)
{
    push_lazy(i, l, r);
    if(ql > r || qr < l)return;

    if(t[i].minval > x)return;
    if(ql <= l && r <= qr)
    {

        if(t[i].maxval <= x)
        {
            t[i].lazy = x;
            push_lazy(i, l, r);
            return;
        }
        else return;
    }
    int mid = (l + r)/2;
    upd_maximum(2*i, l, mid);
    upd_maximum(2*i, mid+1, r);

    t[i].minval = min(t[2*i].minval, t[2*i+1].minval);
    t[i].maxval = max(t[2*i].maxval, t[2*i+1].maxval);
}

int h[MAXN];
void build(int i, int l, int r)
{
    push_lazy(i, l, r);
    if(l == r)
    {
        h[l] = t[i].minval;
        return;
    }
    int mid = (l + r)/2;
    build(2*i, l, mid);
    build(2*i+1, mid+1, r);
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
    for (int i = 0; i < k; ++ i)
    {
        ql = left[i] + 1;
        qr = right[i] + 1;
        x = height[i];
        if(op[i] == 1)
            upd_maximum(1, 1, n);
        else upd_minimum(1, 1, n);
    }
    build(1, 1, n);
    for (int i = 1; i <= n; ++ i)
        finalHeight[i-1] = h[i];
    return;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 5208 KB Output is correct
2 Correct 2 ms 5464 KB Output is correct
3 Incorrect 2 ms 5212 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 5208 KB Output is correct
2 Correct 85 ms 18444 KB Output is correct
3 Incorrect 120 ms 12132 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 5212 KB Output is correct
2 Correct 2 ms 5468 KB Output is correct
3 Incorrect 2 ms 5212 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 5212 KB Output is correct
2 Correct 2 ms 5468 KB Output is correct
3 Incorrect 2 ms 5212 KB Output isn't correct
4 Halted 0 ms 0 KB -