제출 #1215704

#제출 시각아이디문제언어결과실행 시간메모리
1215704jasonicRectangles (IOI19_rect)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define fastIO cin.tie(0); ios::sync_with_stdio(false)

struct ST{
    int l, r;
    ST *lt, *rt;
    int mx;

    void comb() {
        mx = max(lt->mx, rt->mx);
    }

    ST(int bl, int br, vector<int> &a) {
        lt = rt = nullptr;
        l = bl, r = br;

        if(l == r) {
            mx = a[l];
        } else {
            int m = (l+r)/2;
            lt = new ST(l, m, a);
            rt = new ST(m+1, r, a);
            comb();
        }
    }

    int qry(int ql, int qr) {
        if(qr < l || r < ql) return -1;
        if(ql <= l && r <= qr) return mx;
        else return max(lt->qry(ql, qr), rt->qry(ql, qr));
    }
};

ll count_rectangles(vector<vector<int>> arr) {
    int r = size(arr);
    int c = size(arr[0]);

    vector<vector<int>> rotatedArr(c, vector<int>(r, 0));
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            rotatedArr[j][i] = arr[i][j];
        }
    }
    
    vector<vector<int>> maxUp(r, vector<int>(c, -1));
    vector<vector<int>> maxDown(r, vector<int>(c, -1));
    vector<vector<int>> maxLeft(r, vector<int>(c, -1));
    vector<vector<int>> maxRight(r, vector<int>(c, -1));

    set<tuple<int, int, int, int>> valid;

    for(int y = 1; y < r-1; y++) {
        for(int x = 1; x < c-1; x++) {
            int xl = x-1, xr = x+1;
            int yu = y-1, yd = y+1;

            for(; xl >= 0; xl--) if(arr[y][xl] > arr[y][x]) break;
            for(; xr < c; xr++) if(arr[y][xr] > arr[y][x]) break;
            for(; yu >= 0; yu--) if(arr[yu][x] > arr[y][x]) break;
            for(; yd < r; yd++) if(arr[yd][x] > arr[y][x]) break;

            if(yu >= 0 && yd < r && xl >= 0 && xr < c) {
                valid.emplace(make_tuple(xl+1, xr-1, yu+1, yd-1));
            }
        }
    }

    vector<ST> rows, cols;
    for(int i = 0; i < r; i++) {
        rows.push_back(ST(0, c-1, arr[i]));
    }

    for(int i = 0; i < c; i++) {
        cols.push_back(ST(0, r-1, rotatedArr[i]));
    }

    ll ans = 0;

    for(auto i : valid) {
        bool validRect = true;

        int xl = get<0>(i);
        int xr = get<1>(i);
        int yl = get<2>(i);
        int yr = get<3>(i);

        for(int x = xl; x <= xr; x++) {
            validRect &= min(arr[yl-1][x], arr[yr+1][x]) > cols[x].qry(yl, yr);
        }
        
        for(int y = yl; y <= yr; y++) {
            validRect &= min(arr[y][xl-1], arr[y][xr+1]) > rows[y].qry(xl, xr);
        }

        ans += validRect;
    }

    return ans;
}

int main() {
    fastIO;
    
    cout << count_rectangles({{4, 8, 7, 5, 6},
                              {7, 4, 10, 3, 5},
                              {9, 7, 20, 14, 2},
                              {9, 14, 7, 3, 6},
                              {5, 7, 5, 2, 7},
                              {4, 5, 13, 5, 6}});
    
    return 0;
}

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

/usr/bin/ld: /tmp/ccPHcRys.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccMjl9C1.o:rect.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status