답안 #689355

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
689355 2023-01-28T09:39:55 Z finn__ Pyramid Base (IOI08_pyramid_base) C++17
80 / 100
5000 ms 45468 KB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3")
#pragma GCC target("avx2")

template <typename T>
class SegmentTreeMin
{
    vector<T> t, z;
    size_t l;
    T neutral;

public:
    SegmentTreeMin(size_t n, T _neutral)
    {
        neutral = _neutral;
        l = 1 << (32 - __builtin_clz(n));
        t = vector<T>(2 * l, neutral);
        z = vector<T>(2 * l, 0);

        fill(t.begin() + l, t.begin() + l + n, 0);
        for (size_t i = l - 1; i; i--)
            t[i] = min(t[2 * i], t[2 * i + 1]);
    }

private:
    void propagate(size_t k, size_t x, size_t y)
    {
        t[2 * k] += z[k];
        t[2 * k + 1] += z[k];
        z[2 * k] += z[k];
        z[2 * k + 1] += z[k];
        z[k] = 0;
    }

    void increment_r(size_t i, size_t j, T v, size_t k, size_t x, size_t y)
    {
        if (x > y || y < i || x > j)
            return;
        if (i <= x && y <= j)
        {
            t[k] += v;
            z[k] += v;
        }
        else
        {
            propagate(k, x, y);
            increment_r(i, j, v, 2 * k, x, (x + y) / 2);
            increment_r(i, j, v, 2 * k + 1, (x + y) / 2 + 1, y);
            t[k] = min(t[2 * k], t[2 * k + 1]);
        }
    }

public:
    void increment(size_t i, size_t j, T v)
    {
        increment_r(i, j, v, 1, 0, l - 1);
    }

    T get_global_min() const
    {
        return t[1];
    }
};

struct Rectangle
{
    int x1, y1, x2, y2, cost;
};

struct Event
{
    int x, y1, y2, cost;

    Event(int _x, int _y1, int _y2, int _cost)
    {
        x = _x;
        y1 = _y1;
        y2 = _y2;
        cost = _cost;
    }

    bool operator<(Event const &e) const
    {
        return x < e.x;
    }
};

bool can_place_square(
    vector<Rectangle> const &rectangles, int m, int n, int side_length, int b)
{
    vector<Event> events;

    for (Rectangle const &r : rectangles)
    {
        events.emplace_back(
            r.x1 - side_length + 1, max(r.y1 - side_length + 1, 0), r.y2, r.cost);
        events.emplace_back(
            r.x2 + 1, max(r.y1 - side_length + 1, 0), r.y2, -r.cost);
    }

    sort(events.begin(), events.end());
    SegmentTreeMin<int> tree(n - side_length + 1, INT_MAX);
    int curr_x = events[0].x;

    for (Event const &e : events)
    {
        if (curr_x > m - side_length)
            return 0;
        if (e.x != curr_x && 0 < e.x && curr_x <= m - side_length)
        {
            if (tree.get_global_min() <= b)
                return 1;
            curr_x = e.x;
        }
        tree.increment(e.y1, min(e.y2, n - side_length), e.cost);
    }

    return 0;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    unsigned m, n, b, p;
    cin >> m >> n >> b >> p;

    vector<Rectangle> rectangles(p);
    for (auto &[x1, y1, x2, y2, cost] : rectangles)
    {
        cin >> x1 >> y1 >> x2 >> y2 >> cost;
        x1--, y1--, x2--, y2--;
    }

    unsigned u = 0, v = min(m, n);
    while (u < v)
    {
        unsigned side_length = (u + v + 1) / 2;
        if (can_place_square(rectangles, m, n, side_length, b))
            u = side_length;
        else
            v = side_length - 1;
    }

    cout << u << '\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 732 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 2500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 8532 KB Output is correct
2 Correct 166 ms 16920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 203 ms 16860 KB Output is correct
2 Correct 75 ms 8636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 880 KB Output is correct
2 Correct 48 ms 1012 KB Output is correct
3 Correct 40 ms 944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 164 ms 3772 KB Output is correct
2 Correct 260 ms 3652 KB Output is correct
3 Correct 200 ms 3652 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 255 ms 10600 KB Output is correct
2 Correct 37 ms 2416 KB Output is correct
3 Correct 179 ms 18816 KB Output is correct
4 Correct 479 ms 18772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 456 ms 19028 KB Output is correct
2 Correct 723 ms 19236 KB Output is correct
3 Correct 296 ms 10872 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 437 ms 11208 KB Output is correct
2 Correct 933 ms 19448 KB Output is correct
3 Correct 897 ms 19456 KB Output is correct
4 Correct 1000 ms 19372 KB Output is correct
5 Correct 1010 ms 19376 KB Output is correct
6 Correct 245 ms 10192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4379 ms 35312 KB Output is correct
2 Correct 1058 ms 24136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5057 ms 40364 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5040 ms 45468 KB Time limit exceeded
2 Halted 0 ms 0 KB -