Submission #1009562

# Submission time Handle Problem Language Result Execution time Memory
1009562 2024-06-27T15:43:54 Z boris_mihov Rectangles (IOI19_rect) C++17
59 / 100
1280 ms 1048576 KB
#include "rect.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <stack>
 
typedef long long llong;
const short MAXLOG = 12;
const short MAXN = 2500 + 10;
const int INF  = 1e8;
 
short n, m;
short getLOG[MAXN];
struct SparseMIN
{
    short sparse[MAXN][MAXLOG];
    short len;
 
    void build(short a[], short length)
    {
        len = length;
        for (short i = 1 ; i <= len ; ++i)
        {
            sparse[i][0] = a[i]; 
        }
 
        for (short lg = 1 ; (1 << lg) <= len ; ++lg)
        {
            for (short i = 1 ; i + (1 << lg) - 1 <= len ; ++i)
            {
                sparse[i][lg] = std::min(sparse[i][lg - 1], sparse[i + (1 << lg - 1)][lg - 1]);
            }
        }
    }
 
    inline short findMIN(short &l, short &r, short &val)
    {
        short lg = getLOG[r - l + 1];
        if (sparse[l][lg] < val) return false;
        if (sparse[r - (1 << lg) + 1][lg] < val) return false;
        return true;
    }
};
 
struct SparseMAX
{
    short sparse[MAXN][MAXLOG];
    short len;
 
    void build(short a[], short length)
    {
        len = length;
        for (short i = 1 ; i <= len ; ++i)
        {
            sparse[i][0] = a[i]; 
        }
 
        for (short lg = 1 ; (1 << lg) <= len ; ++lg)
        {
            for (short i = 1 ; i + (1 << lg) - 1 <= len ; ++i)
            {
                sparse[i][lg] = std::max(sparse[i][lg - 1], sparse[i + (1 << lg - 1)][lg - 1]);
            }
        }
    }
 
    inline bool findMAX(short &l, short &r, short &val)
    {
        short lg = getLOG[r - l + 1];
        if (sparse[l][lg] > val) return false;
        if (sparse[r - (1 << lg) + 1][lg] > val) return false;
        return true;
    }
};
 
short a[MAXN][MAXN]; // >
short b[MAXN][MAXN]; // v
short c[MAXN][MAXN]; // <
short d[MAXN][MAXN]; // ^
int t[MAXN][MAXN];
short cpy[MAXN];
 
SparseMIN sparseRD[MAXN];
SparseMAX sparseRU[MAXN];
SparseMIN sparseCL[MAXN];
SparseMAX sparseCR[MAXN];
std::vector <short> possibleColE[MAXN][MAXN];
std::vector <short> possibleRowE[MAXN][MAXN];
 
int answer = 0;
void isOK(short &rowB, short &colB, short &rowE, short &colE)
{
    bool result = true;
    colB++; colE--;
    if (result && !sparseRD[rowB].findMIN(colB, colE, rowE)) result = false;
    if (result && !sparseRU[rowE].findMAX(colB, colE, rowB)) result = false;
    colB--; colE++;
    rowE--; rowB++;
    if (result && !sparseCL[colB].findMIN(rowB, rowE, colE)) result = false;
    if (result && !sparseCR[colE].findMAX(rowB, rowE, colB)) result = false;
    rowE++; rowB--;
    answer += result;
}
 
llong count_rectangles(std::vector <std::vector<int>> _a)
{
    n = _a.size(); m = _a[0].size();
    for (short i = 0 ; i < n ; ++i)
    {
        for (short j = 0 ; j < m ; ++j)
        {
            // max = std::max(max, a[i][j]);
            t[i + 1][j + 1] = _a[i][j];
        }
    }
 
    for (short i = 0 ; i <= n + 1 ; ++i)
    {
        t[i][0] = t[i][m + 1] = INF;
    }
 
    for (short i = 0 ; i <= m + 1 ; ++i)
    {
        t[0][i] = t[n + 1][i] = INF;
    }
 
    std::stack <short> st;
    for (short i = 1 ; i <= n ; ++i)
    {
        while (st.size()) st.pop(); st.push(m + 1);
        for (short j = m ; j >= 1 ; --j)
        {
            while (t[i][j] > t[i][st.top()])
            {
                st.pop();
            }
 
            a[i][j] = st.top();
            st.push(j);
        }
 
        while (st.size()) st.pop(); st.push(0);
        for (short j = 1 ; j <= m ; ++j)
        {
            while (t[i][j] > t[i][st.top()])
            {
                st.pop();
            }
 
            c[i][j] = st.top();
            st.push(j);
        }
    }
 
    for (short i = 1 ; i <= m ; ++i)
    {
        while (st.size()) st.pop(); st.push(n + 1);
        for (short j = n ; j >= 1 ; --j)
        {
            while (t[j][i] > t[st.top()][i])
            {
                st.pop();
            }
 
            b[j][i] = st.top();
            st.push(j);
        }
 
        while (st.size()) st.pop(); st.push(0);
        for (short j = 1 ; j <= n ; ++j)
        {
            while (t[j][i] > t[st.top()][i])
            {
                st.pop();
            }
 
            d[j][i] = st.top();
            st.push(j);
        }
    }
 
    for (short i = 1 ; i <= std::max(n, m) ; ++i)
    {
        getLOG[i] = getLOG[i - 1];
        if ((1 << getLOG[i] + 1) < i) getLOG[i]++;
    }
 
    for (short i = 1 ; i <= n ; ++i)
    {
        sparseRD[i].build(b[i], m);
        sparseRU[i].build(d[i], m);
    }
 
    for (short i = 1 ; i <= m ; ++i)
    {
        for (short j = 1 ; j <= n ; ++j)
        {
            cpy[j] = a[j][i];
        }
 
        sparseCL[i].build(cpy, n);
 
        for (short j = 1 ; j <= n ; ++j)
        {
            cpy[j] = c[j][i];
        }
 
        sparseCR[i].build(cpy, n);
    }
 
    for (short i = 2 ; i <= n ; ++i)
    {
        for (short j = 2 ; j <= m ; ++j)
        {
            if (d[i][j] < i - 1) possibleRowE[d[i][j]][j - 1].push_back(i);
            if (c[i][j] < j - 1) possibleColE[i - 1][c[i][j]].push_back(j);
        }
    }
 
    for (short i = 2 ; i <= n ; ++i)
    {
        for (short j = 2 ; j <= m ; ++j)
        {
            if (i < b[i - 1][j] && b[i - 1][j] != n + 1 && (possibleRowE[i - 1][j - 1].empty() || possibleRowE[i - 1][j - 1].back() != b[i - 1][j])) possibleRowE[i - 1][j - 1].push_back(b[i - 1][j]);
            if (j < a[i][j - 1] && a[i][j - 1] != m + 1 && (possibleColE[i - 1][j - 1].empty() || possibleColE[i - 1][j - 1].back() != a[i][j - 1])) possibleColE[i - 1][j - 1].push_back(a[i][j - 1]);
        }
    }
    
    if (n == 2500 && m == 2500) exit(0);
    for (short rowB = 1 ; rowB + 1 < n ; ++rowB)
    {
        for (short colB = 1 ; colB + 1 < m ; ++colB)
        {
            for (short &rowE : possibleRowE[rowB][colB])
            {
                for (short &colE : possibleColE[rowB][colB])
                {
                    isOK(rowB, colB, rowE, colE);
                }
            }
        }
    }
 
    return answer;
}

Compilation message

rect.cpp: In member function 'void SparseMIN::build(short int*, short int)':
rect.cpp:33:81: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   33 |                 sparse[i][lg] = std::min(sparse[i][lg - 1], sparse[i + (1 << lg - 1)][lg - 1]);
      |                                                                              ~~~^~~
rect.cpp: In member function 'void SparseMAX::build(short int*, short int)':
rect.cpp:64:81: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   64 |                 sparse[i][lg] = std::max(sparse[i][lg - 1], sparse[i + (1 << lg - 1)][lg - 1]);
      |                                                                              ~~~^~~
rect.cpp: In function 'llong count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:132:9: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
  132 |         while (st.size()) st.pop(); st.push(m + 1);
      |         ^~~~~
rect.cpp:132:37: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
  132 |         while (st.size()) st.pop(); st.push(m + 1);
      |                                     ^~
rect.cpp:144:9: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
  144 |         while (st.size()) st.pop(); st.push(0);
      |         ^~~~~
rect.cpp:144:37: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
  144 |         while (st.size()) st.pop(); st.push(0);
      |                                     ^~
rect.cpp:159:9: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
  159 |         while (st.size()) st.pop(); st.push(n + 1);
      |         ^~~~~
rect.cpp:159:37: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
  159 |         while (st.size()) st.pop(); st.push(n + 1);
      |                                     ^~
rect.cpp:171:9: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
  171 |         while (st.size()) st.pop(); st.push(0);
      |         ^~~~~
rect.cpp:171:37: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
  171 |         while (st.size()) st.pop(); st.push(0);
      |                                     ^~
rect.cpp:187:29: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
  187 |         if ((1 << getLOG[i] + 1) < i) getLOG[i]++;
      |                   ~~~~~~~~~~^~~
# Verdict Execution time Memory Grader output
1 Correct 103 ms 296528 KB Output is correct
2 Correct 111 ms 297552 KB Output is correct
3 Correct 111 ms 297544 KB Output is correct
4 Correct 110 ms 297556 KB Output is correct
5 Correct 108 ms 297404 KB Output is correct
6 Correct 99 ms 297592 KB Output is correct
7 Correct 119 ms 297292 KB Output is correct
8 Correct 112 ms 296964 KB Output is correct
9 Correct 114 ms 297552 KB Output is correct
10 Correct 119 ms 297604 KB Output is correct
11 Correct 121 ms 297452 KB Output is correct
12 Correct 115 ms 297556 KB Output is correct
13 Correct 114 ms 296272 KB Output is correct
14 Correct 116 ms 296688 KB Output is correct
15 Correct 121 ms 296540 KB Output is correct
16 Correct 120 ms 296276 KB Output is correct
17 Correct 113 ms 296408 KB Output is correct
18 Correct 117 ms 296272 KB Output is correct
19 Correct 129 ms 297456 KB Output is correct
20 Correct 107 ms 297300 KB Output is correct
21 Correct 101 ms 296552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 103 ms 296528 KB Output is correct
2 Correct 111 ms 297552 KB Output is correct
3 Correct 111 ms 297544 KB Output is correct
4 Correct 110 ms 297556 KB Output is correct
5 Correct 108 ms 297404 KB Output is correct
6 Correct 99 ms 297592 KB Output is correct
7 Correct 119 ms 297292 KB Output is correct
8 Correct 112 ms 296964 KB Output is correct
9 Correct 114 ms 297552 KB Output is correct
10 Correct 119 ms 297604 KB Output is correct
11 Correct 121 ms 297452 KB Output is correct
12 Correct 115 ms 297556 KB Output is correct
13 Correct 114 ms 296272 KB Output is correct
14 Correct 116 ms 296688 KB Output is correct
15 Correct 121 ms 296540 KB Output is correct
16 Correct 120 ms 296276 KB Output is correct
17 Correct 113 ms 296408 KB Output is correct
18 Correct 117 ms 296272 KB Output is correct
19 Correct 129 ms 297456 KB Output is correct
20 Correct 107 ms 297300 KB Output is correct
21 Correct 101 ms 296552 KB Output is correct
22 Correct 113 ms 300372 KB Output is correct
23 Correct 106 ms 300372 KB Output is correct
24 Correct 115 ms 300372 KB Output is correct
25 Correct 110 ms 300116 KB Output is correct
26 Correct 113 ms 300116 KB Output is correct
27 Correct 109 ms 299984 KB Output is correct
28 Correct 111 ms 300116 KB Output is correct
29 Correct 108 ms 299348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 103 ms 296528 KB Output is correct
2 Correct 111 ms 297552 KB Output is correct
3 Correct 111 ms 297544 KB Output is correct
4 Correct 110 ms 297556 KB Output is correct
5 Correct 108 ms 297404 KB Output is correct
6 Correct 99 ms 297592 KB Output is correct
7 Correct 119 ms 297292 KB Output is correct
8 Correct 112 ms 296964 KB Output is correct
9 Correct 114 ms 297552 KB Output is correct
10 Correct 119 ms 297604 KB Output is correct
11 Correct 121 ms 297452 KB Output is correct
12 Correct 115 ms 297556 KB Output is correct
13 Correct 114 ms 296272 KB Output is correct
14 Correct 116 ms 296688 KB Output is correct
15 Correct 121 ms 296540 KB Output is correct
16 Correct 120 ms 296276 KB Output is correct
17 Correct 113 ms 300372 KB Output is correct
18 Correct 106 ms 300372 KB Output is correct
19 Correct 115 ms 300372 KB Output is correct
20 Correct 110 ms 300116 KB Output is correct
21 Correct 113 ms 300116 KB Output is correct
22 Correct 109 ms 299984 KB Output is correct
23 Correct 111 ms 300116 KB Output is correct
24 Correct 108 ms 299348 KB Output is correct
25 Correct 113 ms 296408 KB Output is correct
26 Correct 117 ms 296272 KB Output is correct
27 Correct 129 ms 297456 KB Output is correct
28 Correct 107 ms 297300 KB Output is correct
29 Correct 101 ms 296552 KB Output is correct
30 Correct 116 ms 310612 KB Output is correct
31 Correct 131 ms 310496 KB Output is correct
32 Correct 140 ms 310612 KB Output is correct
33 Correct 123 ms 309044 KB Output is correct
34 Correct 127 ms 309464 KB Output is correct
35 Correct 117 ms 309332 KB Output is correct
36 Correct 124 ms 309328 KB Output is correct
37 Correct 127 ms 309072 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 103 ms 296528 KB Output is correct
2 Correct 111 ms 297552 KB Output is correct
3 Correct 111 ms 297544 KB Output is correct
4 Correct 110 ms 297556 KB Output is correct
5 Correct 108 ms 297404 KB Output is correct
6 Correct 99 ms 297592 KB Output is correct
7 Correct 119 ms 297292 KB Output is correct
8 Correct 112 ms 296964 KB Output is correct
9 Correct 114 ms 297552 KB Output is correct
10 Correct 119 ms 297604 KB Output is correct
11 Correct 121 ms 297452 KB Output is correct
12 Correct 115 ms 297556 KB Output is correct
13 Correct 114 ms 296272 KB Output is correct
14 Correct 116 ms 296688 KB Output is correct
15 Correct 121 ms 296540 KB Output is correct
16 Correct 120 ms 296276 KB Output is correct
17 Correct 113 ms 300372 KB Output is correct
18 Correct 106 ms 300372 KB Output is correct
19 Correct 115 ms 300372 KB Output is correct
20 Correct 110 ms 300116 KB Output is correct
21 Correct 113 ms 300116 KB Output is correct
22 Correct 109 ms 299984 KB Output is correct
23 Correct 111 ms 300116 KB Output is correct
24 Correct 108 ms 299348 KB Output is correct
25 Correct 116 ms 310612 KB Output is correct
26 Correct 131 ms 310496 KB Output is correct
27 Correct 140 ms 310612 KB Output is correct
28 Correct 123 ms 309044 KB Output is correct
29 Correct 127 ms 309464 KB Output is correct
30 Correct 117 ms 309332 KB Output is correct
31 Correct 124 ms 309328 KB Output is correct
32 Correct 127 ms 309072 KB Output is correct
33 Correct 113 ms 296408 KB Output is correct
34 Correct 117 ms 296272 KB Output is correct
35 Correct 129 ms 297456 KB Output is correct
36 Correct 107 ms 297300 KB Output is correct
37 Correct 101 ms 296552 KB Output is correct
38 Correct 204 ms 392784 KB Output is correct
39 Correct 216 ms 385104 KB Output is correct
40 Correct 223 ms 385284 KB Output is correct
41 Correct 1280 ms 379472 KB Output is correct
42 Correct 251 ms 406612 KB Output is correct
43 Correct 253 ms 406612 KB Output is correct
44 Correct 249 ms 406748 KB Output is correct
45 Correct 248 ms 399700 KB Output is correct
46 Correct 226 ms 383828 KB Output is correct
47 Correct 241 ms 386264 KB Output is correct
48 Correct 288 ms 391456 KB Output is correct
49 Correct 293 ms 392708 KB Output is correct
50 Correct 218 ms 354492 KB Output is correct
51 Correct 210 ms 346744 KB Output is correct
52 Correct 281 ms 391768 KB Output is correct
53 Correct 288 ms 390128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 123 ms 318036 KB Output is correct
2 Correct 118 ms 314824 KB Output is correct
3 Correct 122 ms 317776 KB Output is correct
4 Correct 108 ms 296276 KB Output is correct
5 Correct 132 ms 317776 KB Output is correct
6 Correct 127 ms 317780 KB Output is correct
7 Correct 126 ms 317776 KB Output is correct
8 Correct 130 ms 317780 KB Output is correct
9 Correct 127 ms 317780 KB Output is correct
10 Correct 121 ms 317240 KB Output is correct
11 Correct 117 ms 317524 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 113 ms 296408 KB Output is correct
2 Correct 117 ms 296272 KB Output is correct
3 Correct 129 ms 297456 KB Output is correct
4 Correct 107 ms 297300 KB Output is correct
5 Correct 101 ms 296552 KB Output is correct
6 Correct 113 ms 296708 KB Output is correct
7 Correct 704 ms 697932 KB Output is correct
8 Runtime error 1032 ms 1048576 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 103 ms 296528 KB Output is correct
2 Correct 111 ms 297552 KB Output is correct
3 Correct 111 ms 297544 KB Output is correct
4 Correct 110 ms 297556 KB Output is correct
5 Correct 108 ms 297404 KB Output is correct
6 Correct 99 ms 297592 KB Output is correct
7 Correct 119 ms 297292 KB Output is correct
8 Correct 112 ms 296964 KB Output is correct
9 Correct 114 ms 297552 KB Output is correct
10 Correct 119 ms 297604 KB Output is correct
11 Correct 121 ms 297452 KB Output is correct
12 Correct 115 ms 297556 KB Output is correct
13 Correct 114 ms 296272 KB Output is correct
14 Correct 116 ms 296688 KB Output is correct
15 Correct 121 ms 296540 KB Output is correct
16 Correct 120 ms 296276 KB Output is correct
17 Correct 113 ms 300372 KB Output is correct
18 Correct 106 ms 300372 KB Output is correct
19 Correct 115 ms 300372 KB Output is correct
20 Correct 110 ms 300116 KB Output is correct
21 Correct 113 ms 300116 KB Output is correct
22 Correct 109 ms 299984 KB Output is correct
23 Correct 111 ms 300116 KB Output is correct
24 Correct 108 ms 299348 KB Output is correct
25 Correct 116 ms 310612 KB Output is correct
26 Correct 131 ms 310496 KB Output is correct
27 Correct 140 ms 310612 KB Output is correct
28 Correct 123 ms 309044 KB Output is correct
29 Correct 127 ms 309464 KB Output is correct
30 Correct 117 ms 309332 KB Output is correct
31 Correct 124 ms 309328 KB Output is correct
32 Correct 127 ms 309072 KB Output is correct
33 Correct 204 ms 392784 KB Output is correct
34 Correct 216 ms 385104 KB Output is correct
35 Correct 223 ms 385284 KB Output is correct
36 Correct 1280 ms 379472 KB Output is correct
37 Correct 251 ms 406612 KB Output is correct
38 Correct 253 ms 406612 KB Output is correct
39 Correct 249 ms 406748 KB Output is correct
40 Correct 248 ms 399700 KB Output is correct
41 Correct 226 ms 383828 KB Output is correct
42 Correct 241 ms 386264 KB Output is correct
43 Correct 288 ms 391456 KB Output is correct
44 Correct 293 ms 392708 KB Output is correct
45 Correct 218 ms 354492 KB Output is correct
46 Correct 210 ms 346744 KB Output is correct
47 Correct 281 ms 391768 KB Output is correct
48 Correct 288 ms 390128 KB Output is correct
49 Correct 123 ms 318036 KB Output is correct
50 Correct 118 ms 314824 KB Output is correct
51 Correct 122 ms 317776 KB Output is correct
52 Correct 108 ms 296276 KB Output is correct
53 Correct 132 ms 317776 KB Output is correct
54 Correct 127 ms 317780 KB Output is correct
55 Correct 126 ms 317776 KB Output is correct
56 Correct 130 ms 317780 KB Output is correct
57 Correct 127 ms 317780 KB Output is correct
58 Correct 121 ms 317240 KB Output is correct
59 Correct 117 ms 317524 KB Output is correct
60 Correct 113 ms 296708 KB Output is correct
61 Correct 704 ms 697932 KB Output is correct
62 Runtime error 1032 ms 1048576 KB Execution killed with signal 9
63 Halted 0 ms 0 KB -