Submission #231132

#TimeUsernameProblemLanguageResultExecution timeMemory
231132achibasadzishviliRectangles (IOI19_rect)C++14
0 / 100
1658 ms466592 KiB
#include<bits/stdc++.h>
#define ll int
#define f first
#define s second
#define pb push_back
#define mp make_pair
using namespace std;
vector<ll>vec[2505][2505];
ll l[2505][2505],r[2505][2505],dow[2505][2505],up[2505][2505];
ll qve[2505][2505],ze[2505][2505];
ll rig[2505][2505],lef[2505][2505];
vector<pair<ll,ll> >row[2505],col[2505];
long long count_rectangles(vector<vector<int> >a){
    ll n = (ll)a.size();
    ll m = (ll)a[0].size();
    stack<pair<ll,ll> >st;
    for(int i=0; i<n; i++){
        while(st.size())st.pop();
        for(int j=0; j<m; j++){
            while(st.size() && a[i][j] > st.top().f)st.pop();
            l[i][j] = -1;
            if(st.size())l[i][j] = st.top().s;
            st.push(mp(a[i][j] , j));
        }
        while(st.size())st.pop();
        for(int j=m - 1; j>=0; j--){
            while(st.size() && a[i][j] > st.top().f)st.pop();
            r[i][j] = m + 1;
            if(st.size())r[i][j] = st.top().s;
            st.push(mp(a[i][j] , j));
        }
        for(int j=0; j<m; j++){
            if(l[i][j] != -1){
                // l[i][j] , j is possible
                row[i].pb(mp(l[i][j] , j));
            }
            if(r[i][j] != m + 1){
                // j r[i][j] is possible
                row[i].pb(mp(j , r[i][j]));
            }
        }
    }
    
    for(int i=0; i<m; i++){
        while(st.size())st.pop();
        for(int j=0; j<n; j++){
            while(st.size() && a[j][i] > st.top().f)st.pop();
            up[j][i] = -1;
            if(st.size())up[j][i] = st.top().s;
            st.push(mp(a[j][i] , j));
        }
        while(st.size())st.pop();
        for(int j=n - 1; j>=0; j--){
            while(st.size() && a[j][i] > st.top().f)st.pop();
            dow[j][i] = n + 1;
            if(st.size())dow[j][i] = st.top().s;
            st.push(mp(a[j][i] , j));
        }
        for(int j=0; j<n; j++){
            if(up[j][i] != -1){
                vec[up[j][i]][i].pb(j);
                col[i].pb(mp(up[j][i] , j));
            }
            if(dow[j][i] != n + 1){
                if(a[j][i] != a[dow[j][i]][i])
                vec[j][i].pb(dow[j][i]);
                col[i].pb(mp(j , dow[j][i]));
            }
        }
    }
    
    for(int i=0; i<m; i++){
        for(int j=0; j<col[i].size(); j++){
            ll x = col[i][j].f;
            ll y = col[i][j].s;
            bool ok = 0;
            if(a[x][i] <= a[y][i])
                qve[x][i] = 1;
            if(a[x][i] >= a[y][i])
                ze[y][i] = 1;
            if(i == 0){
                continue;
            }
            if(a[x][i] <= a[y][i] && a[x][i - 1] <= a[y][i - 1] && dow[x][i - 1] == y)
                qve[x][i] = qve[x][i - 1] + 1;
            if(a[x][i] >= a[y][i] && a[x][i - 1] <= a[y][i - 1] && dow[x][i - 1] == y)
                ze[y][i] = qve[x][i - 1] + 1;
            if(a[x][i] <= a[y][i] && a[x][i - 1] >= a[y][i - 1] && up[y][i - 1] == x)
                qve[x][i] = ze[y][i - 1] + 1;
            if(a[x][i] >= a[y][i] && a[x][i - 1] >= a[y][i - 1] && up[y][i - 1] == x)
                ze[y][i] = ze[x][i - 1] + 1;
        }
    }
    
    for(int i=n - 1; i>=0; i--){
        for(int j=0; j<row[i].size(); j++){
            ll x = row[i][j].f;
            ll y = row[i][j].s;
            bool ok = 0;
            if(a[i][x] <= a[i][y])
                rig[i][x] = 1;
            if(a[i][x] >= a[i][y])
                lef[i][y] = 1;
            if(i == n - 1){
                continue;
            }
            if(a[i][x] <= a[i][y] && a[i + 1][x] <= a[i + 1][y] && r[i + 1][x] == y)
                rig[i][x] = rig[i + 1][x] + 1;
            if(a[i][x] >= a[i][y] && a[i + 1][x] <= a[i + 1][y] && r[i + 1][x] == y)
                lef[i][y] = rig[i + 1][x] + 1;
            if(a[i][x] <= a[i][y] && a[i + 1][x] >= a[i + 1][y] && l[i + 1][y] == x)
                rig[i][x] = lef[i + 1][y] + 1;
            if(a[i][x] >= a[i][y] && a[i + 1][x] >= a[i + 1][y] && l[i + 1][y] == x)
                lef[i][y] = lef[i + 1][y] + 1;
        }
    }
    ll ans = 0;
    for(int x=1; x<n-1; x++){
        for(int y=0; y<m; y++){
            // cout << x << " " << y << " " << l[x][y] << " " << r[x][y] << '\n';
            if(l[x][y] != -1 && a[x][l[x][y]] >= a[x][y] && l[x][y] < y - 1){
                //cout << x - 1 << " --- " << y - 1 << '\n';
                for(int i=0; i<vec[x - 1][y - 1].size(); i++){
                    ll z = vec[x - 1][y - 1][i];
                    if(z == x)continue;
                    bool k = 0 , p = 0;
                    if(lef[x][y] >= z - x)k = 1;
                    if(a[x - 1][y - 1] <= a[z][y - 1] && qve[x - 1][y - 1] >= y - l[x][y] - 1)p = 1;
                    if(a[x - 1][y - 1] >= a[z][y - 1] && ze[z][y - 1] >= y - l[x][y] - 1)p = 1;
                //    cout << x << " " << y << " " << l[x][y] << " " << z << '\n';
                    if(p && k){
                    //    cout << " +1";
                        ans++;
                    }
                //    cout << '\n';
                }
            }
            if(r[x][y] < m && a[x][r[x][y]] > a[x][y] && r[x][y] > y + 1){
            //    cout << x - 1 << " -- " << y + 1 << '\n';
                for(int i=0; i<vec[x - 1][y + 1].size(); i++){
                    ll z = vec[x - 1][y + 1][i];
                    if(z == x)continue;
                    bool k = 0 , p = 0;
                    if(rig[x][y] >= z - x)k = 1;
                    if(a[x - 1][y + 1] <= a[z][y + 1] && qve[x - 1][y + 1] >= r[x][y] - y - 1)p = 1;
                    if(a[x - 1][y + 1] >= a[z][y + 1] && ze[z][y + 1] >= r[x][y] - y - 1)p = 1;
                //    cout << x << " " << y << " " << r[x][y] << " " << z << " " << rig[x][y] << " " << p << '\n';
                    if(p && k){
                    //    cout << " +";
                        ans++;
                    }
                    //cout << '\n';
                }
            }
        }
    }
    return ans;
}
/*
6 5
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
*/

Compilation message (stderr)

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:73:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j=0; j<col[i].size(); j++){
                      ~^~~~~~~~~~~~~~
rect.cpp:76:18: warning: unused variable 'ok' [-Wunused-variable]
             bool ok = 0;
                  ^~
rect.cpp:96:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j=0; j<row[i].size(); j++){
                      ~^~~~~~~~~~~~~~
rect.cpp:99:18: warning: unused variable 'ok' [-Wunused-variable]
             bool ok = 0;
                  ^~
rect.cpp:123:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0; i<vec[x - 1][y - 1].size(); i++){
                              ~^~~~~~~~~~~~~~~~~~~~~~~~~
rect.cpp:140:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0; i<vec[x - 1][y + 1].size(); i++){
                              ~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...