답안 #1085822

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1085822 2024-09-08T19:04:06 Z kkzyr Pyramid Base (IOI08_pyramid_base) C++17
10 / 100
1835 ms 81576 KB
#include <iostream>
#include <algorithm>
using namespace std;

const int MAX_N = 1e6 + 1;
const int MAX_OBSTACLES = 4e5 + 1;

int n, m, b;
int num_obstacles;
pair<int, int> obstacle_x[MAX_OBSTACLES];
pair<int, int> obstacle_y[MAX_OBSTACLES];
int cost[MAX_OBSTACLES];

struct event{
    int x, type, y_start, y_end;
};

bool comp(event x, event y){
    return x.x < y.x;
}

event events[2 * MAX_OBSTACLES];

struct node{
    int left_bound, right_bound;
    int left_zeros;
    int right_zeros;
    int all_zeros;
    int lazy;
};

node merge(node left, node right){
    node actual_left = left;
    node actual_right = right;
    if (left.lazy != 0){
        actual_left.all_zeros = 0;
        actual_left.left_zeros = 0;
        actual_left.right_zeros = 0;
    }
    if (right.lazy != 0){
        actual_right.all_zeros = 0;
        actual_right.left_zeros = 0;
        actual_right.right_zeros = 0;
    }
    node x = {left.left_bound, right.right_bound, 0, 0, 0, 0};
    if (actual_left.left_zeros == (left.right_bound - left.left_bound + 1)){
        x.left_zeros = actual_left.left_zeros + actual_right.left_zeros;
    }
    else{
        x.left_zeros = actual_left.left_zeros;
    }
    if (actual_right.right_zeros == (right.right_bound - right.left_bound + 1)){
        x.right_zeros = actual_right.right_zeros + actual_left.right_zeros;
    }
    else{
        x.right_zeros = actual_right.right_zeros;
    }
    x.all_zeros = max(max(actual_left.all_zeros, actual_right.all_zeros), actual_left.right_zeros + actual_right.left_zeros);
    return x;
}

int size_of_tree;
node tree[4 * MAX_N];

void update(int left, int right, int tree_node, int delta){
    int node_left = tree[tree_node].left_bound;
    int node_right = tree[tree_node].right_bound;
    if (node_right < left or node_left > right){
        return;
    }
    if (node_left >= left and node_right <= right){
        tree[tree_node].lazy += delta;
        return;
    }
    tree[2 * tree_node].lazy += tree[tree_node].lazy;
    tree[2 * tree_node + 1].lazy += tree[tree_node].lazy;
    update(left, right, 2 * tree_node, delta);
    update(left, right, 2 * tree_node + 1, delta);
    tree[tree_node] = merge(tree[2 * tree_node], tree[2 * tree_node + 1]);
}

node longest_consecutive;

void find_longest_consecutive(int left, int right, int tree_node){
    int node_left = tree[tree_node].left_bound;
    int node_right = tree[tree_node].right_bound;
    if (node_right < left or node_left > right){
        return;
    }
    if (node_left >= left and node_right <= right){
        longest_consecutive = merge(longest_consecutive, tree[tree_node]);
        return;
    }
    tree[2 * tree_node].lazy += tree[tree_node].lazy;
    tree[2 * tree_node + 1].lazy += tree[tree_node].lazy;
    find_longest_consecutive(left, right, 2 * tree_node);
    find_longest_consecutive(left, right, 2 * tree_node + 1);
    tree[tree_node] = merge(tree[2 * tree_node], tree[2 * tree_node + 1]);
}

int main(){
    cin >> m >> n >> b >> num_obstacles;
    for (int i = 1;i <= num_obstacles;i++){
        cin >> obstacle_x[i].first >> obstacle_y[i].first >> obstacle_x[i].second >> obstacle_y[i].second >> cost[i];
        events[2 * i - 1] = {obstacle_x[i].first, 1, obstacle_y[i].first, obstacle_y[i].second};
        events[2 * i] = {obstacle_x[i].second + 1, -1, obstacle_y[i].first, obstacle_y[i].second};
    }
    sort(events + 1, events + 2 * num_obstacles + 1, comp);
    size_of_tree = 1;
    while (size_of_tree < n){
        size_of_tree *= 2;
    }
    for (int i = 1;i <= size_of_tree;i++){
        tree[size_of_tree + i - 1] = {i, i, 1, 1, 1, 0};
    }
    for (int i = size_of_tree - 1;i >= 1;i--){
        tree[i] = merge(tree[2 * i], tree[2 * i + 1]);
    }
    int ans = 0;
    int ctr = 1;
    int ctr_2 = 1;
    int curr = 0;
    for (int i = 1;i <= m;i++){
        while (events[ctr_2].x == i){
            if (events[ctr_2].type == -1){
                update(events[ctr_2].y_start, events[ctr_2].y_end, 1, events[ctr_2].type);
            }
            ctr_2++;
        }
        longest_consecutive = {0, 0, 0, 0, 0, 0};
        find_longest_consecutive(1, n, 1);
        if (longest_consecutive.all_zeros >= (curr - i + 1)){
            ans = max(ans, curr - i + 1);
        }
        else{
            continue;
        }
        while ((curr + 1) <= m){
            curr++;
            while (ctr <= 2 * num_obstacles and events[ctr].x == curr){
                if (events[ctr].type == 1){
                    update(events[ctr].y_start, events[ctr].y_end, 1, events[ctr].type);
                }
                ctr++;
            }
            longest_consecutive = {0, 0, 0, 0, 0, 0};
            find_longest_consecutive(1, n, 1);
            if (longest_consecutive.all_zeros < (curr - i + 1)){
                break;
            }
            ans = max(ans, curr - i + 1);
        }
    }
    cout << ans << '\n';
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 1116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 68 ms 6492 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 688 ms 49720 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 696 ms 49748 KB Output is correct
2 Incorrect 694 ms 49776 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 1372 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 89 ms 7504 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 734 ms 51296 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 753 ms 51692 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 755 ms 52052 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1204 ms 65616 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1408 ms 73824 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1594 ms 81576 KB Output is correct
2 Correct 1795 ms 80976 KB Output is correct
3 Correct 1835 ms 80940 KB Output is correct
4 Correct 1765 ms 80720 KB Output is correct
5 Incorrect 1454 ms 81044 KB Output isn't correct
6 Halted 0 ms 0 KB -