Submission #535418

#TimeUsernameProblemLanguageResultExecution timeMemory
535418mario05092929Rectangles (IOI19_rect)C++14
100 / 100
3366 ms718452 KiB
#include "rect.h"
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
#define all(v) v.begin(),v.end()
#pragma gcc optimize("O3")
#pragma gcc optimize("Ofast")
#pragma gcc optimize("unroll-loops")
using namespace std;
const int INF = 1e9;
const int TMX = 1 << 18;
const long long llINF = 1e16;
const long long mod = 1e9+7;
const long long hashmod = 100003;
const int MAXN = 100000;
const int MAXM = 1000000;
typedef long long ll;
typedef long double ld;
typedef pair <int,int> pi;
typedef pair <ll,ll> pl;
typedef vector <int> vec;
typedef vector <pi> vecpi;
typedef long long ll;
int n,m,a[2505][2505];
int L[2505][2505],R[2505][2505],U[2505][2505],D[2505][2505];
stack <pi> s;
vec N[2505][2505],M[2505][2505];
vector <pair<pi,pi>> V;

void make_LRUD() {
	for(int i = 1;i <= n;i++) {
		s.push({INF,-1});
		for(int j = 1;j <= m;j++) {
			while(s.top().x <= a[i][j]) s.pop();
			L[i][j] = s.top().y;
			s.push({a[i][j],j});
		}
		while(!s.empty()) s.pop();
	}
	for(int i = 1;i <= n;i++) {
		s.push({INF,-1});
		for(int j = m;j >= 1;j--) {
			while(s.top().x <= a[i][j]) s.pop();
			R[i][j] = s.top().y;
			s.push({a[i][j],j});
		}
		while(!s.empty()) s.pop();
	}
	for(int i = 1;i <= m;i++) {
		s.push({INF,-1});
		for(int j = 1;j <= n;j++) {
			while(s.top().x <= a[j][i]) s.pop();
			U[j][i] = s.top().y;
			s.push({a[j][i],j});
		}
		while(!s.empty()) s.pop();
	}
	for(int i = 1;i <= m;i++) {
		s.push({INF,-1});
		for(int j = n;j >= 1;j--) {
			while(s.top().x <= a[j][i]) s.pop();
			D[j][i] = s.top().y;
			s.push({a[j][i],j});
		}
		while(!s.empty()) s.pop();
	}
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= m;j++) {
            int sx = U[i][j], sy = L[i][j], ex = D[i][j], ey = R[i][j];
            if(sx != -1&&ex != -1) N[sx][ex].pb(j);
            if(sy != -1&&ey != -1) M[sy][ey].pb(i);
        }
    }
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= n;j++) sort(all(N[i][j])), N[i][j].erase(unique(all(N[i][j])),N[i][j].end());
    }
    for(int i = 1;i <= m;i++) {
        for(int j = 1;j <= m;j++) sort(all(M[i][j])), M[i][j].erase(unique(all(M[i][j])),M[i][j].end());
    }
}

ll count_rectangles(vector<vector<int>> A) {
    n = A.size(), m = A[0].size();
    for(int i = 0;i < n;i++) {
        for(int j = 0;j < m;j++) a[i+1][j+1] = A[i][j];
    }
    make_LRUD();
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= m;j++) {
            int sx = U[i][j], sy = L[i][j], ex = D[i][j], ey = R[i][j];
            if(sx == -1||sy == -1||ex == -1||ey == -1) continue;
            int L = upper_bound(all(N[sx][ex]),sy)-N[sx][ex].begin();
            int R = lower_bound(all(N[sx][ex]),ey)-N[sx][ex].begin()-1;
            if(L == N[sx][ex].size()||R == -1||R-L != ey-sy-2) continue;
            L = upper_bound(all(M[sy][ey]),sx)-M[sy][ey].begin();
            R = lower_bound(all(M[sy][ey]),ex)-M[sy][ey].begin()-1;
            if(L == M[sy][ey].size()||R == -1||R-L != ex-sx-2) continue;
            V.pb({{sx,sy},{ex,ey}});
        }
    }
    sort(all(V)), V.erase(unique(all(V)),V.end());
    return V.size();
}

Compilation message (stderr)

rect.cpp:7: warning: ignoring '#pragma gcc optimize' [-Wunknown-pragmas]
    7 | #pragma gcc optimize("O3")
      | 
rect.cpp:8: warning: ignoring '#pragma gcc optimize' [-Wunknown-pragmas]
    8 | #pragma gcc optimize("Ofast")
      | 
rect.cpp:9: warning: ignoring '#pragma gcc optimize' [-Wunknown-pragmas]
    9 | #pragma gcc optimize("unroll-loops")
      | 
rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:95:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |             if(L == N[sx][ex].size()||R == -1||R-L != ey-sy-2) continue;
      |                ~~^~~~~~~~~~~~~~~~~~~
rect.cpp:98:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |             if(L == M[sy][ey].size()||R == -1||R-L != ex-sx-2) continue;
      |                ~~^~~~~~~~~~~~~~~~~~~
#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...