제출 #404041

#제출 시각아이디문제언어결과실행 시간메모리
404041EveruleRectangles (IOI19_rect)C++17
컴파일 에러
0 ms0 KiB
//#include "rect.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
long long count_rectangles(std::vector<std::vector<int> > a) {
    int n = a.size(), m = a[0].size();
	vector hr(n, vector(m, vector(0,pair(0, 0))));
    vector vr(n, vector(m, pair(pair(0,0), pair(0,0))));
    for(int i=0;i<n;i++){
        stack<int> stk;
        for(int j=0;j<m;j++){
            while(!stk.empty()){
                int k = stk.top();
                if(hr[k][j].empty() || hr[k][j].back().second + 1 != i){
                    hr[k][j].emplace_back(i,i);
                }
                else{
                    hr[k][j].back().second++;
                }
                if(a[i][k] < a[i][j]){
                    stk.pop();
                }
                else{
                    break;
                }
            }
            stk.push(j);
        }
    }
    /*
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<i<<" "<<j<<"\n";
            for(auto &[l,r] : hr[i][j]){
                cout<<l<<" "<<r<<"\n";
            }
            cout<<"\n\n";
        }
    }
    */
    for(int j=m-1;j>=0;--j){
        stack<int> stk;
        for(int i=0;i<n;i++){
            while(!stk.empty()){
                int k = stk.top();
                if(a[k][j] < a[i][j]){
                    vr[k][j].second.first = i;
                    int lf = j;
                    if(j < m-1 && vr[k][j+1].second.first == i){
                        lf = max(lf, vr[k][j+1].second.second);
                    }
                    if(j < m-1 && vr[i][j+1].first.first == k){
                        lf = max(lf, vr[i][j+1].first.second);
                    }
                    vr[k][j].second.second = lf;
                    stk.pop();
                }
                else{
                    vr[i][j].first.first = k;
                    int lf = j;
                    if(j < m-1 && vr[k][j+1].second.first == i){
                        lf = max(lf, vr[k][j+1].second.second);
                    }
                    if(j < m-1 && vr[i][j+1].first.first == k){
                        lf = max(lf, vr[i][j+1].first.second);
                    }
                    vr[i][j].first.second = lf;
                    break;
                }
            }
            stk.push(i);
        }
    }
    /*for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<i<<" "<<j<<"\n";
            cout<<vr[i][j].first.first<<" "<<vr[i][j].first.second<<" "<<vr[i][j].second.first<<" "<<vr[i][j].second.second<<"\n";
        }
    }
    cout<<"\n\n";
    */
    ll ans = 0;
    for(int i=0;i<m;i++){
        for(int j=i+2;j<m;j++){
            for(auto &[l,r] : hr[i][j]){
                for(int k=max(l-1,0);k<=min(r+1,n-1);k++){
                    auto [l1,d1] = vr[k][i+1].first;
                    auto [r2,d2] = vr[k][i+1].second;
                    if(l <= l1 + 1 && l1 + 1 < k && d1 >= j-1){
                        //cout<<i<<" "<<j<<" "<<l1<<" "<<k<<"\n";
                        ans++;
                    }
                    if(r2 - 1 <= r && k < r2 - 1 && d2 >= j-1){
                        //cout<<i<<" "<<j<<" "<<k<<" "<<r2<<"\n";
                        ans++;
                    }
                }
            }
        }
    }
    return ans;
}
int main(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>> a(n, vector<int>(m));
    for(auto &v : a){
        for(auto &x : v){
            cin>>x;
        }
    }
    cout<<count_rectangles(a)<<"\n";
}

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

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