답안 #1007008

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1007008 2024-06-24T10:53:06 Z Ausp3x 벽 (IOI14_wall) C++17
0 / 100
78 ms 8020 KB
// 人外有人,天外有天
// author: Ausp3x

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
typedef long long             lng;
typedef unsigned int          uint;
typedef unsigned long long    ulng;
using namespace std;
using namespace __gnu_pbds;

int const INF32 = 0x3f3f3f3f;
lng const INF64 = 0x3f3f3f3f3f3f3f3f;

int nextPowOf2(int n) {
    n--;
    n |= n >> 1;
    n |= n >> 2;
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
    n++;

    return n;
}

int n2;
vector<pair<int, int>> segt;

void update(int op, int l, int r, int turn, int h) {
    l += n2;
    r += n2;

    if (op == 1) 
        while (l <= r) {
            if (l & 1) {
                if (segt[l].first == -1 || segt[l].second < h)
                    segt[l] = {turn, h};
                l++;
            }
            if (!(r & 1)) {
                if (segt[r].first == -1 || segt[r].second < h)
                    segt[r] = {turn, h};
                r--;
            }

            l >>= 1;
            r >>= 1;
        }
    else if (op == 2) {
        while (l <= r) {
            if (l & 1) {
                if (segt[l].first == -1 || segt[l].second > h)
                    segt[l] = {turn, h};
                l++;
            }
            if (!(r & 1)) {
                if (segt[r].first == -1 || segt[r].second > h)
                    segt[r] = {turn, h};
                r--;
            }

            l >>= 1;
            r >>= 1;
        }
    }

    return;
}

lng query(int op[], int i) {
    i += n2;

    vector<pair<int, int>> pending_updates;
    while (i > 0) {
        if (segt[i].first != -1)
            pending_updates.push_back(segt[i]);
        
        i >>= 1;
    }

    sort(pending_updates.begin(), pending_updates.end());

    int res = 0;
    for (auto [turn, h] : pending_updates)
        if (op[turn] == 1 && res < h)
            res = h;
        else if (op[turn] == 2 && res > h)
            res = h;

    return res;
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
    n2 = nextPowOf2(n);
    segt.clear();
    segt.resize(2 * n2, {-1, 0});

    for (int i = 0; i < k; i++) {
        update(op[i], left[i], right[i], i, height[i]);
    }

    for (int i = 0; i < n; i++)
        finalHeight[i] = query(op, i);

    // for (int i = 0; i < n; i++)
    //     cout << finalHeight[i] << ' ';
    // cout << endl;

    return;
}

/*
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int t = 1;
    cin >> t;
    while (t--) {
        int n, k;
        cin >> n >> k;
        int op[k], left[k], right[k], height[k], finalHeight[n];
        for (int i = 0; i < k; i++)
            cin >> op[i] >> left[i] >> right[i] >> height[i];

        buildWall(n, k, op, left, right, height, finalHeight);
    }

    return 0;
}
//*/
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 78 ms 8020 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -