답안 #1015846

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1015846 2024-07-06T22:17:00 Z u_suck_o 식물 비교 (IOI20_plants) C++17
0 / 100
1 ms 604 KB
#include "bits/stdc++.h"
#include "plants.h"
#define MAXN 10 //200005
#define SZ 10 //524290

using namespace std;

pair<int, int> seg[SZ];
int lazy[SZ];
int h[MAXN];
int n, newn;

void prop(int node) {
    seg[2*node].first += lazy[node];
    seg[2*node+1].first += lazy[node];
    lazy[2*node] += lazy[node];
    lazy[2*node+1] += lazy[node];
    lazy[node] = 0;
}

void upd(int node, int l, int r, int ql, int qr, int val) {
    if (l > qr || r < ql)
        return;
    if (ql <= l && r <= qr) {
        seg[node].first += val;
        lazy[node] += val;
        return;
    }
    prop(node);
    int mid = (l+r)/2;
    upd(2*node, l, mid, ql, qr, val);
    upd(2*node+1, mid+1, r, ql, qr, val);
    seg[node] = min(seg[2*node], seg[2*node+1]);
}

pair<int, int> query(int node, int l, int r, int ql, int qr) {
    if (l > qr || r < ql)
        return {1e9, -1};
    if (ql <= l && r <= qr)
        return seg[node];
    prop(node);
    int mid = (l+r)/2;
    return min(query(2*node, l, mid, ql, qr), query(2*node+1, mid+1, r, ql, qr));
}

void init(int k, vector<int> r) {
    n = r.size();
    newn = pow(2, ceil(log2(n)));
    r.insert(r.begin() + 0, -1);
    for (int i = 1; i <= n; i++)
        seg[newn+i-1].second = i;
    for (int i = 1; i <= n; i++)
        upd(1, 1, newn, i, i, r[i]);
    
    for (int height = n; height >= 1; height--) {
        //find zeroes
        int z = query(1, 1, newn, 1, n).second;
        while (true) {
            if (z-k+1 >= 1) {
                auto p = query(1, 1, newn, z-k+1, z-1);
                if (p.first > 0)
                    break;
                else
                    z = p.second;
            } else {
                auto p1 = query(1, 1, newn, z-k+1+n, n);
                if (p1.first == 0)
                    z = p1.second;
                else {
                    auto p2 = query(1, 1, newn, 1, z-1);
                    if (p2.first == 0)
                        z = p2.second;
                    else
                        break;
                }
            }
        }
        upd(1, 1, newn, z, z, 1e9);
        h[z] = height;
        if (z-k+1 >= 1)
            upd(1, 1, newn, z-k+1, z-1, -1);
        else {
            upd(1, 1, newn, z-k+1+n, n, -1);
            upd(1, 1, newn, 1, z-1, -1);
        }
    }
    return;
}

int compare_plants(int x, int y) {
    if (h[x+1] > h[y+1]) return 1;
    else return -1;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 436 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Runtime error 1 ms 344 KB Execution killed with signal 11
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Runtime error 0 ms 348 KB Execution killed with signal 11
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Runtime error 0 ms 348 KB Execution killed with signal 11
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 348 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Runtime error 1 ms 604 KB Execution killed with signal 11
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Runtime error 0 ms 348 KB Execution killed with signal 11
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 436 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Runtime error 1 ms 344 KB Execution killed with signal 11
5 Halted 0 ms 0 KB -