제출 #1343866

#제출 시각아이디문제언어결과실행 시간메모리
1343866Semicolon벽 (IOI14_wall)C++20
컴파일 에러
0 ms0 KiB
/**
 *     Author: Lưu Diệp Thành (Save Diệp Thành)
 *     Le Hong Phong High School for the Gifted (i2528)
**/
#include<bits/stdc++.h>
using namespace std;
// #define int long long
#define ll long long
#define ushort unsigned short
#define FOR(i,l,r) for(int i = (l), _r = (r); i <= _r; i++)
#define FORN(i,r,l) for(int i = (r), _l = (l); i >= _l; i--)
#define endl '\n'
#define sz(x) (int)x.size()
#define fi first
#define se second
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define MASK(x) (1LL << (x))
#define BIT(x,i) (((x) >> (i)) & 1)
#define ins insert
#define segleft (id<<1)
#define segright (id<<1|1)
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
const int MOD = 1e9+7;

struct Node {
    int minvalue = 0, maxvalue = INT_MAX;
};

struct SegmentTree {
private:
    vector<Node> st;
    int n;

    void apply(int id, Node &x) {
        st[id].minvalue = max(st[id].minvalue, x.minvalue);
        st[id].maxvalue = max(st[id].minvalue, st[id].maxvalue);
        st[id].maxvalue = min(st[id].maxvalue, x.maxvalue);
    }

    void push(int id) {
        apply(segleft, st[id]);
        apply(segright, st[id]);
        st[id] = Node();
    }

    void update(int id, int l, int r, int u, int v, Node &x) {
        if (l > v || r < u) return;
        if (l >= u && r <= v) {
            apply(id, x);
            return;
        }
        push(id);
        int mid = l+r>>1;
        update(segleft, l, mid, u, v, x);
        update(segright, mid+1, r, u, v, x);
    }

    int get(int id, int l, int r, int index) {
        if (l==r) return st[id].minvalue;
        push(id);
        int mid = l+r>>1;
        if (index <= mid) {
            return get(segleft, l, mid, index);
        } else {
            return get(segright, mid+1, r, index);
        }
    }

public:
    SegmentTree(int _n) {
        n = _n;
        st.assign(4*n+4, Node());
    }

    void updateRange(int l, int r, Node &x) {
        update(1, 0, n-1, l, r, x);
    }

    int getIdx(int index) {
        return get(1, 0, n-1, index).minvalue;
    }
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
    SegmentTree tree(n);
    FOR(i, 0, k-1) {
        if (op[i]) {
            tree.updateRange(left[i], right[i], {height[i], INT_MAX});
        } else {
            tree.updateRange(left[i], right[i], {0, height[i]});
        }
    }

    FOR(i, 0, n-1) {
        finalHeight[i] = tree.getIdx(i);
    }
}

컴파일 시 표준 에러 (stderr) 메시지

wall.cpp:83:2: error: expected ';' after struct definition
   83 | }
      |  ^
      |  ;
wall.cpp: In member function 'int SegmentTree::getIdx(int)':
wall.cpp:81:38: error: request for member 'minvalue' in '((SegmentTree*)this)->SegmentTree::get(1, 0, (((SegmentTree*)this)->SegmentTree::n - 1), index)', which is of non-class type 'int'
   81 |         return get(1, 0, n-1, index).minvalue;
      |                                      ^~~~~~~~
wall.cpp: In function 'void buildWall(int, int, int*, int*, int*, int*, int*)':
wall.cpp:89:29: error: cannot bind non-const lvalue reference of type 'Node&' to an rvalue of type 'Node'
   89 |             tree.updateRange(left[i], right[i], {height[i], INT_MAX});
      |             ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wall.cpp:76:42: note:   initializing argument 3 of 'void SegmentTree::updateRange(int, int, Node&)'
   76 |     void updateRange(int l, int r, Node &x) {
      |                                    ~~~~~~^
wall.cpp:91:29: error: cannot bind non-const lvalue reference of type 'Node&' to an rvalue of type 'Node'
   91 |             tree.updateRange(left[i], right[i], {0, height[i]});
      |             ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wall.cpp:76:42: note:   initializing argument 3 of 'void SegmentTree::updateRange(int, int, Node&)'
   76 |     void updateRange(int l, int r, Node &x) {
      |                                    ~~~~~~^