제출 #199512

#제출 시각아이디문제언어결과실행 시간메모리
199512medkRectangles (IOI19_rect)C++14
59 / 100
5256 ms294988 KiB
#include <bits/stdc++.h>
#include "rect.h"

#define ll long long
#define pb push_back
#define x first
#define y second

using namespace std;

int n,m;
map<pair<int,int>,set<pair<int,int>>> mp,mp2;


ll count_rectangles(vector<vector<int>> a)
{
    //freopen("test.in","r",stdin);
    //ios::sync_with_stdio(0); cin.tie(0);
    int n=a.size(), m=a[0].size();
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            int k; cin>>k;
            a[i].pb(k);
        }for(int i=0;i<n;i++)
        for(int j=0;j<m-1;j++)
    {
        int mx=a[i][j+1];
        for(int k=j+2;k<m;k++)
        {
            if(mx>=a[i][j]) break;
            if(mx>=a[i][k]) continue;
            mx=a[i][k];
            int num=1;
            if(mp.count({i-1,j}))
            {
                auto it = mp[{i-1,j}].lower_bound({k,0});
                if(it!=mp[{i-1,j}].end()) if((*it).x==k) num+=(*it).y;
            }
            mp[{i,j}].insert({k,num});
            num=1;
            if(mp.count({i-1,k}))
            {
                auto it = mp[{i-1,k}].lower_bound({j,0});
                if(it!=mp[{i-1,k}].end()) if((*it).x==j) num+=(*it).y;
            }
            mp[{i,k}].insert({j,num});
        }
    }
    ll ans=0;
    for(int j=1;j<m-1;j++)
    {
        for(int i=0;i<n-1;i++)
        {
            int mx=a[i+1][j];
            for(int k=i+2;k<n;k++)
            {
                if(mx>=a[i][j]) break;
                if(mx>=a[k][j]) continue;
                mx=a[k][j];
                int num=1;
                if(mp2.count({i,j-1}))
                {
                    auto it = mp2[{i,j-1}].lower_bound({k,0});
                    if(it!=mp2[{i,j-1}].end()) if((*it).x==k) num+=(*it).y;
                }
                mp2[{i,j}].insert({k,num});
                num=1;
                if(mp2.count({k,j-1}))
                {
                    auto it = mp2[{k,j-1}].lower_bound({i,0});
                    if(it!=mp2[{k,j-1}].end()) if((*it).x==i) num+=(*it).y;
                }
                mp2[{k,j}].insert({i,num});
                auto it = mp[{k-1,j+1}].lower_bound({j-num,k-i-1});
                for(;it!=mp[{k-1,j+1}].end();it++)
                {
                    if((*it).x>j+1) break;
                    if((*it).y>=k-i-1) ans++;
                }
            }
        }
    }
    return ans;
}
#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...