Submission #289793

# Submission time Handle Problem Language Result Execution time Memory
289793 2020-09-03T05:07:20 Z Mercenary Rectangles (IOI19_rect) C++14
100 / 100
4029 ms 664172 KB
#include "rect.h"
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>

#define pb push_back
#define mp make_pair
#define taskname "A"

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int maxn = 2505;
const int lim = 50;

vector<ii> valA[maxn][maxn] , valB[maxn][maxn];

int m , n;

int h[maxn][maxn];
int L[maxn][maxn] , R[maxn][maxn] , U[maxn][maxn] , D[maxn][maxn];

void init(int key){
    vector<int> s(maxn , 0);
    int sz = 0;
    auto add = [&](vector<ii> & val , int j){
        if(val.size() && val.back().first + val.back().second == j)val.back().second++;
        else {
            if(val.size() && val.back().second <= lim)val.back() = mp(j , 1);
            else val.pb(mp(j,1));
        }
    };
    for(int i = 1 ; i <= m ; ++i){
        sz = 0;
        for(int j = 1 ; j <= n ; ++j){
            while(sz > 0 && h[i][s[sz - 1]] + key <= h[i][j])sz--;
            if(sz > 0)L[i][j] = s[sz - 1];
            else L[i][j] = 0;
            s[sz++] = j;
        }
        sz = 0;
        for(int j = n ; j >= 1 ; --j){
            while(sz > 0 && h[i][s[sz - 1]] + key <= h[i][j])sz--;
            if(sz > 0)R[i][j] = s[sz - 1];
            else R[i][j] = n + 1;
            s[sz++] = j;
            if(key){
                if(L[i][j] != 0)add(valA[L[i][j]][j] , i);
                if(R[i][j] != n + 1 && L[i][R[i][j]] != j)add(valA[j][R[i][j]] , i);
            }
        }
    }
    for(int j = 1 ; j <= n ; ++j){
        sz = 0;
        for(int i = 1 ; i <= m ; ++i){
            while(sz > 0 && h[s[sz - 1]][j] + key <= h[i][j])sz--;
            if(sz > 0)U[i][j] = s[sz - 1];
            else U[i][j] = 0;
            s[sz++] = i;
        }
        sz = 0;
        for(int i = m ; i >= 1 ; --i){
            while(sz > 0 && h[s[sz - 1]][j] + key <= h[i][j])sz--;
            if(sz > 0)D[i][j] = s[sz - 1];
            else D[i][j] = m + 1;
            s[sz++] = i;
            if(key){
                if(U[i][j] != 0)add(valB[U[i][j]][i], j);
                if(D[i][j] != m + 1 && U[D[i][j]][j] != i)add(valB[i][D[i][j]] , j);
            }
        }
    }
}
pair<ii,ii> val[maxn * maxn];

long long count_rectangles(std::vector<std::vector<int> > a) {
    m = a.size();n = a[0].size();
    for(int i = 1 ; i <= m ; ++i)for(int j = 1 ; j <= n ; ++j)h[i][j] = a[i - 1][j - 1];
    init(0);
    int sz = 0;
    for(int i = 2 ; i < m ; ++i){
        for(int j = 2 ; j < n ; ++j){
            if(L[i][j] && U[i][j] && R[i][j] <= n && D[i][j] <= m){
                auto cur = mp(mp(L[i][j] , R[i][j]) , mp(U[i][j] , D[i][j]));
                if(sz > 0 && val[sz - 1] == cur)continue;
                val[sz++] = cur;
            }
        }
    }
    init(1);
    sort(val,val+sz);
    int res = 0;
    for(int i = 0 ; i < sz ; ++i){
        if(i > 0 && val[i] == val[i - 1])continue;
        int L = val[i].first.first , R = val[i].first.second , U = val[i].second.first , D = val[i].second.second;
         auto checkA = [&](int L , int R , int U , int D)->bool{
            if(::R[U][L] < R || ::L[U][R] > L)return 0;
            if(D - U + 1 <= lim){
                for(int i = U ; i <= D ; ++i){
                    if(::R[i][L] < R || ::L[i][R] > L){
                        return 0;
                    }
                }
                return 1;
            }
            auto it = upper_bound(valA[L][R].begin(),valA[L][R].end(),mp(U + 1 , 0))-valA[L][R].begin()-1;
            if(it < 0 || valA[L][R][it].first + valA[L][R][it].second <= D)return 0;
            return 1;
        };
        auto checkB = [&](int L , int R , int U , int D)->bool{
            if(::D[L][U] < R || ::U[R][U] > L)return 0;
            if(D - U + 1 <= lim){
                for(int i = U ; i <= D ; ++i){
                    if(::D[L][i] < R || ::U[R][i] > L){
                        return 0;
                    }
                }
                return 1;
            }
            auto it = lower_bound(valB[L][R].begin(),valB[L][R].end(),mp(U+1,0))-valB[L][R].begin()-1;
            if(it < 0 || valB[L][R][it].first + valB[L][R][it].second <= D)return 0;
            return 1;
        };
        if(checkA(L , R , U + 1 , D - 1) && checkB(U , D , L + 1 , R - 1)){
            res++;
        }
    }
    return res;
}

#ifdef LOCAL
#include "rect.h"
#include <cstdio>
#include <unistd.h>
#include <cassert>
#include <string>

using namespace std;

class InputReader {
private:
	static const int SIZE = 4096;

	int inputFileDescriptor;
	char buf[SIZE];
	int curChar;
	int numChars;

public:

	inline InputReader(int _inputFileDescriptor):
		inputFileDescriptor(_inputFileDescriptor),
		curChar(0),
		numChars(0) {
	}

	inline void close() {
		::close(inputFileDescriptor);
	}

	inline char read() {
		assert(numChars != -1);
		if (curChar >= numChars) {
			curChar = 0;
			numChars = ::read(inputFileDescriptor, buf, SIZE);
			if (numChars == -1)
				return -1;
		}
		return buf[curChar++];
	}

	inline int readInt() {
		int c = eatWhite();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		int res = 0;
		do {
			assert(c >= '0' && c <= '9');
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}

	inline string readString() {
		char c = eatWhite();
		string res;
		do {
			res += c;
			c = read();
		} while (!isSpaceChar(c));
		return res;
	}

	inline string readLine() {
		string res;
		while (true) {
			char c = read();
			if (c == '\n' || c == '\r' || c == -1)
				break;
			res += c;
		}
		return res;
	}

	inline char eatWhite() {
		char c = read();
		while (isSpaceChar(c))
			c = read();
		return c;
	}

	static inline bool isSpaceChar(char c) {
		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	}
};


int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(taskname".INP","r")){
		freopen(taskname".INP", "r",stdin);
		freopen(taskname".OUT", "w",stdout);
    }
	InputReader inputReader(STDIN_FILENO);
	int n, m;
	n = inputReader.readInt();
	m = inputReader.readInt();
	vector<vector<int>> a(n, vector<int>(m));
	for (int i = 0; i < n; i++)	{
		for (int j = 0; j < m; j++) {
			a[i][j] = inputReader.readInt();
		}
	}
	inputReader.close();

	long long result = count_rectangles(a);

	printf("%lld\n", result);
	fclose(stdout);
	return 0;
}

#endif // LOCAL
# Verdict Execution time Memory Grader output
1 Correct 200 ms 295160 KB Output is correct
2 Correct 199 ms 295672 KB Output is correct
3 Correct 205 ms 295800 KB Output is correct
4 Correct 200 ms 295672 KB Output is correct
5 Correct 208 ms 295784 KB Output is correct
6 Correct 201 ms 295800 KB Output is correct
7 Correct 200 ms 295672 KB Output is correct
8 Correct 201 ms 295288 KB Output is correct
9 Correct 203 ms 295908 KB Output is correct
10 Correct 201 ms 295800 KB Output is correct
11 Correct 202 ms 295800 KB Output is correct
12 Correct 202 ms 295800 KB Output is correct
13 Correct 202 ms 295084 KB Output is correct
14 Correct 199 ms 295288 KB Output is correct
15 Correct 202 ms 295288 KB Output is correct
16 Correct 201 ms 295160 KB Output is correct
17 Correct 199 ms 295088 KB Output is correct
18 Correct 199 ms 295160 KB Output is correct
19 Correct 198 ms 295768 KB Output is correct
20 Correct 201 ms 295672 KB Output is correct
21 Correct 203 ms 295288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 200 ms 295160 KB Output is correct
2 Correct 199 ms 295672 KB Output is correct
3 Correct 205 ms 295800 KB Output is correct
4 Correct 200 ms 295672 KB Output is correct
5 Correct 208 ms 295784 KB Output is correct
6 Correct 201 ms 295800 KB Output is correct
7 Correct 200 ms 295672 KB Output is correct
8 Correct 201 ms 295288 KB Output is correct
9 Correct 203 ms 295908 KB Output is correct
10 Correct 201 ms 295800 KB Output is correct
11 Correct 202 ms 295800 KB Output is correct
12 Correct 202 ms 295800 KB Output is correct
13 Correct 202 ms 295084 KB Output is correct
14 Correct 199 ms 295288 KB Output is correct
15 Correct 202 ms 295288 KB Output is correct
16 Correct 201 ms 295160 KB Output is correct
17 Correct 202 ms 297080 KB Output is correct
18 Correct 201 ms 296952 KB Output is correct
19 Correct 206 ms 296952 KB Output is correct
20 Correct 202 ms 296952 KB Output is correct
21 Correct 201 ms 297080 KB Output is correct
22 Correct 201 ms 297084 KB Output is correct
23 Correct 202 ms 297084 KB Output is correct
24 Correct 200 ms 296824 KB Output is correct
25 Correct 199 ms 295088 KB Output is correct
26 Correct 199 ms 295160 KB Output is correct
27 Correct 198 ms 295768 KB Output is correct
28 Correct 201 ms 295672 KB Output is correct
29 Correct 203 ms 295288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 200 ms 295160 KB Output is correct
2 Correct 199 ms 295672 KB Output is correct
3 Correct 205 ms 295800 KB Output is correct
4 Correct 200 ms 295672 KB Output is correct
5 Correct 208 ms 295784 KB Output is correct
6 Correct 201 ms 295800 KB Output is correct
7 Correct 200 ms 295672 KB Output is correct
8 Correct 201 ms 295288 KB Output is correct
9 Correct 203 ms 295908 KB Output is correct
10 Correct 201 ms 295800 KB Output is correct
11 Correct 202 ms 295800 KB Output is correct
12 Correct 202 ms 295800 KB Output is correct
13 Correct 202 ms 295084 KB Output is correct
14 Correct 199 ms 295288 KB Output is correct
15 Correct 202 ms 295288 KB Output is correct
16 Correct 201 ms 295160 KB Output is correct
17 Correct 202 ms 297080 KB Output is correct
18 Correct 201 ms 296952 KB Output is correct
19 Correct 206 ms 296952 KB Output is correct
20 Correct 202 ms 296952 KB Output is correct
21 Correct 201 ms 297080 KB Output is correct
22 Correct 201 ms 297084 KB Output is correct
23 Correct 202 ms 297084 KB Output is correct
24 Correct 200 ms 296824 KB Output is correct
25 Correct 212 ms 301176 KB Output is correct
26 Correct 211 ms 301048 KB Output is correct
27 Correct 211 ms 301176 KB Output is correct
28 Correct 215 ms 300796 KB Output is correct
29 Correct 224 ms 301304 KB Output is correct
30 Correct 217 ms 301432 KB Output is correct
31 Correct 222 ms 301176 KB Output is correct
32 Correct 223 ms 301176 KB Output is correct
33 Correct 199 ms 295088 KB Output is correct
34 Correct 199 ms 295160 KB Output is correct
35 Correct 198 ms 295768 KB Output is correct
36 Correct 201 ms 295672 KB Output is correct
37 Correct 203 ms 295288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 200 ms 295160 KB Output is correct
2 Correct 199 ms 295672 KB Output is correct
3 Correct 205 ms 295800 KB Output is correct
4 Correct 200 ms 295672 KB Output is correct
5 Correct 208 ms 295784 KB Output is correct
6 Correct 201 ms 295800 KB Output is correct
7 Correct 200 ms 295672 KB Output is correct
8 Correct 201 ms 295288 KB Output is correct
9 Correct 203 ms 295908 KB Output is correct
10 Correct 201 ms 295800 KB Output is correct
11 Correct 202 ms 295800 KB Output is correct
12 Correct 202 ms 295800 KB Output is correct
13 Correct 202 ms 295084 KB Output is correct
14 Correct 199 ms 295288 KB Output is correct
15 Correct 202 ms 295288 KB Output is correct
16 Correct 201 ms 295160 KB Output is correct
17 Correct 202 ms 297080 KB Output is correct
18 Correct 201 ms 296952 KB Output is correct
19 Correct 206 ms 296952 KB Output is correct
20 Correct 202 ms 296952 KB Output is correct
21 Correct 201 ms 297080 KB Output is correct
22 Correct 201 ms 297084 KB Output is correct
23 Correct 202 ms 297084 KB Output is correct
24 Correct 200 ms 296824 KB Output is correct
25 Correct 212 ms 301176 KB Output is correct
26 Correct 211 ms 301048 KB Output is correct
27 Correct 211 ms 301176 KB Output is correct
28 Correct 215 ms 300796 KB Output is correct
29 Correct 224 ms 301304 KB Output is correct
30 Correct 217 ms 301432 KB Output is correct
31 Correct 222 ms 301176 KB Output is correct
32 Correct 223 ms 301176 KB Output is correct
33 Correct 364 ms 339708 KB Output is correct
34 Correct 351 ms 340600 KB Output is correct
35 Correct 342 ms 340472 KB Output is correct
36 Correct 328 ms 340344 KB Output is correct
37 Correct 431 ms 332920 KB Output is correct
38 Correct 425 ms 332512 KB Output is correct
39 Correct 433 ms 332764 KB Output is correct
40 Correct 412 ms 330452 KB Output is correct
41 Correct 353 ms 327544 KB Output is correct
42 Correct 369 ms 328952 KB Output is correct
43 Correct 446 ms 334072 KB Output is correct
44 Correct 455 ms 335224 KB Output is correct
45 Correct 329 ms 322680 KB Output is correct
46 Correct 316 ms 315768 KB Output is correct
47 Correct 434 ms 332408 KB Output is correct
48 Correct 431 ms 333432 KB Output is correct
49 Correct 199 ms 295088 KB Output is correct
50 Correct 199 ms 295160 KB Output is correct
51 Correct 198 ms 295768 KB Output is correct
52 Correct 201 ms 295672 KB Output is correct
53 Correct 203 ms 295288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 205 ms 295544 KB Output is correct
2 Correct 206 ms 295416 KB Output is correct
3 Correct 201 ms 295416 KB Output is correct
4 Correct 201 ms 295160 KB Output is correct
5 Correct 202 ms 295672 KB Output is correct
6 Correct 203 ms 295672 KB Output is correct
7 Correct 202 ms 295672 KB Output is correct
8 Correct 199 ms 295632 KB Output is correct
9 Correct 199 ms 295544 KB Output is correct
10 Correct 202 ms 295288 KB Output is correct
11 Correct 201 ms 295444 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 198 ms 295288 KB Output is correct
2 Correct 1207 ms 403720 KB Output is correct
3 Correct 2476 ms 516268 KB Output is correct
4 Correct 2541 ms 517812 KB Output is correct
5 Correct 2491 ms 517768 KB Output is correct
6 Correct 872 ms 382120 KB Output is correct
7 Correct 1548 ms 466896 KB Output is correct
8 Correct 1627 ms 470316 KB Output is correct
9 Correct 199 ms 295088 KB Output is correct
10 Correct 199 ms 295160 KB Output is correct
11 Correct 198 ms 295768 KB Output is correct
12 Correct 201 ms 295672 KB Output is correct
13 Correct 203 ms 295288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 200 ms 295160 KB Output is correct
2 Correct 199 ms 295672 KB Output is correct
3 Correct 205 ms 295800 KB Output is correct
4 Correct 200 ms 295672 KB Output is correct
5 Correct 208 ms 295784 KB Output is correct
6 Correct 201 ms 295800 KB Output is correct
7 Correct 200 ms 295672 KB Output is correct
8 Correct 201 ms 295288 KB Output is correct
9 Correct 203 ms 295908 KB Output is correct
10 Correct 201 ms 295800 KB Output is correct
11 Correct 202 ms 295800 KB Output is correct
12 Correct 202 ms 295800 KB Output is correct
13 Correct 202 ms 295084 KB Output is correct
14 Correct 199 ms 295288 KB Output is correct
15 Correct 202 ms 295288 KB Output is correct
16 Correct 201 ms 295160 KB Output is correct
17 Correct 202 ms 297080 KB Output is correct
18 Correct 201 ms 296952 KB Output is correct
19 Correct 206 ms 296952 KB Output is correct
20 Correct 202 ms 296952 KB Output is correct
21 Correct 201 ms 297080 KB Output is correct
22 Correct 201 ms 297084 KB Output is correct
23 Correct 202 ms 297084 KB Output is correct
24 Correct 200 ms 296824 KB Output is correct
25 Correct 212 ms 301176 KB Output is correct
26 Correct 211 ms 301048 KB Output is correct
27 Correct 211 ms 301176 KB Output is correct
28 Correct 215 ms 300796 KB Output is correct
29 Correct 224 ms 301304 KB Output is correct
30 Correct 217 ms 301432 KB Output is correct
31 Correct 222 ms 301176 KB Output is correct
32 Correct 223 ms 301176 KB Output is correct
33 Correct 364 ms 339708 KB Output is correct
34 Correct 351 ms 340600 KB Output is correct
35 Correct 342 ms 340472 KB Output is correct
36 Correct 328 ms 340344 KB Output is correct
37 Correct 431 ms 332920 KB Output is correct
38 Correct 425 ms 332512 KB Output is correct
39 Correct 433 ms 332764 KB Output is correct
40 Correct 412 ms 330452 KB Output is correct
41 Correct 353 ms 327544 KB Output is correct
42 Correct 369 ms 328952 KB Output is correct
43 Correct 446 ms 334072 KB Output is correct
44 Correct 455 ms 335224 KB Output is correct
45 Correct 329 ms 322680 KB Output is correct
46 Correct 316 ms 315768 KB Output is correct
47 Correct 434 ms 332408 KB Output is correct
48 Correct 431 ms 333432 KB Output is correct
49 Correct 205 ms 295544 KB Output is correct
50 Correct 206 ms 295416 KB Output is correct
51 Correct 201 ms 295416 KB Output is correct
52 Correct 201 ms 295160 KB Output is correct
53 Correct 202 ms 295672 KB Output is correct
54 Correct 203 ms 295672 KB Output is correct
55 Correct 202 ms 295672 KB Output is correct
56 Correct 199 ms 295632 KB Output is correct
57 Correct 199 ms 295544 KB Output is correct
58 Correct 202 ms 295288 KB Output is correct
59 Correct 201 ms 295444 KB Output is correct
60 Correct 198 ms 295288 KB Output is correct
61 Correct 1207 ms 403720 KB Output is correct
62 Correct 2476 ms 516268 KB Output is correct
63 Correct 2541 ms 517812 KB Output is correct
64 Correct 2491 ms 517768 KB Output is correct
65 Correct 872 ms 382120 KB Output is correct
66 Correct 1548 ms 466896 KB Output is correct
67 Correct 1627 ms 470316 KB Output is correct
68 Correct 2816 ms 664172 KB Output is correct
69 Correct 2623 ms 663288 KB Output is correct
70 Correct 2457 ms 663160 KB Output is correct
71 Correct 2176 ms 663444 KB Output is correct
72 Correct 3665 ms 565900 KB Output is correct
73 Correct 2334 ms 467844 KB Output is correct
74 Correct 2545 ms 523044 KB Output is correct
75 Correct 3829 ms 580184 KB Output is correct
76 Correct 2394 ms 468856 KB Output is correct
77 Correct 3225 ms 550568 KB Output is correct
78 Correct 4029 ms 581884 KB Output is correct
79 Correct 2232 ms 456920 KB Output is correct
80 Correct 3746 ms 565672 KB Output is correct
81 Correct 3628 ms 557176 KB Output is correct
82 Correct 2312 ms 506232 KB Output is correct
83 Correct 3650 ms 565100 KB Output is correct
84 Correct 3689 ms 565024 KB Output is correct
85 Correct 3692 ms 565064 KB Output is correct
86 Correct 199 ms 295088 KB Output is correct
87 Correct 199 ms 295160 KB Output is correct
88 Correct 198 ms 295768 KB Output is correct
89 Correct 201 ms 295672 KB Output is correct
90 Correct 203 ms 295288 KB Output is correct