답안 #1009557

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1009557 2024-06-27T15:42:32 Z boris_mihov Rectangles (IOI19_rect) C++17
59 / 100
1081 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]);
        }
    }
    
    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]++;
      |                   ~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 296368 KB Output is correct
2 Correct 110 ms 297556 KB Output is correct
3 Correct 103 ms 297556 KB Output is correct
4 Correct 101 ms 297468 KB Output is correct
5 Correct 115 ms 297556 KB Output is correct
6 Correct 109 ms 297556 KB Output is correct
7 Correct 108 ms 297200 KB Output is correct
8 Correct 108 ms 296788 KB Output is correct
9 Correct 107 ms 297428 KB Output is correct
10 Correct 115 ms 297540 KB Output is correct
11 Correct 106 ms 297552 KB Output is correct
12 Correct 107 ms 297556 KB Output is correct
13 Correct 116 ms 296216 KB Output is correct
14 Correct 111 ms 296532 KB Output is correct
15 Correct 114 ms 296528 KB Output is correct
16 Correct 102 ms 296272 KB Output is correct
17 Correct 114 ms 296272 KB Output is correct
18 Correct 106 ms 296400 KB Output is correct
19 Correct 113 ms 297556 KB Output is correct
20 Correct 119 ms 297300 KB Output is correct
21 Correct 120 ms 296572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 296368 KB Output is correct
2 Correct 110 ms 297556 KB Output is correct
3 Correct 103 ms 297556 KB Output is correct
4 Correct 101 ms 297468 KB Output is correct
5 Correct 115 ms 297556 KB Output is correct
6 Correct 109 ms 297556 KB Output is correct
7 Correct 108 ms 297200 KB Output is correct
8 Correct 108 ms 296788 KB Output is correct
9 Correct 107 ms 297428 KB Output is correct
10 Correct 115 ms 297540 KB Output is correct
11 Correct 106 ms 297552 KB Output is correct
12 Correct 107 ms 297556 KB Output is correct
13 Correct 116 ms 296216 KB Output is correct
14 Correct 111 ms 296532 KB Output is correct
15 Correct 114 ms 296528 KB Output is correct
16 Correct 102 ms 296272 KB Output is correct
17 Correct 114 ms 296272 KB Output is correct
18 Correct 106 ms 296400 KB Output is correct
19 Correct 113 ms 297556 KB Output is correct
20 Correct 119 ms 297300 KB Output is correct
21 Correct 120 ms 296572 KB Output is correct
22 Correct 115 ms 300372 KB Output is correct
23 Correct 121 ms 300368 KB Output is correct
24 Correct 122 ms 300372 KB Output is correct
25 Correct 118 ms 300116 KB Output is correct
26 Correct 114 ms 300112 KB Output is correct
27 Correct 121 ms 300116 KB Output is correct
28 Correct 123 ms 300120 KB Output is correct
29 Correct 124 ms 299220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 296368 KB Output is correct
2 Correct 110 ms 297556 KB Output is correct
3 Correct 103 ms 297556 KB Output is correct
4 Correct 101 ms 297468 KB Output is correct
5 Correct 115 ms 297556 KB Output is correct
6 Correct 109 ms 297556 KB Output is correct
7 Correct 108 ms 297200 KB Output is correct
8 Correct 108 ms 296788 KB Output is correct
9 Correct 107 ms 297428 KB Output is correct
10 Correct 115 ms 297540 KB Output is correct
11 Correct 106 ms 297552 KB Output is correct
12 Correct 107 ms 297556 KB Output is correct
13 Correct 116 ms 296216 KB Output is correct
14 Correct 111 ms 296532 KB Output is correct
15 Correct 114 ms 296528 KB Output is correct
16 Correct 102 ms 296272 KB Output is correct
17 Correct 115 ms 300372 KB Output is correct
18 Correct 121 ms 300368 KB Output is correct
19 Correct 122 ms 300372 KB Output is correct
20 Correct 118 ms 300116 KB Output is correct
21 Correct 114 ms 300112 KB Output is correct
22 Correct 121 ms 300116 KB Output is correct
23 Correct 123 ms 300120 KB Output is correct
24 Correct 124 ms 299220 KB Output is correct
25 Correct 114 ms 296272 KB Output is correct
26 Correct 106 ms 296400 KB Output is correct
27 Correct 113 ms 297556 KB Output is correct
28 Correct 119 ms 297300 KB Output is correct
29 Correct 120 ms 296572 KB Output is correct
30 Correct 131 ms 310688 KB Output is correct
31 Correct 128 ms 310480 KB Output is correct
32 Correct 142 ms 310548 KB Output is correct
33 Correct 128 ms 308844 KB Output is correct
34 Correct 139 ms 309332 KB Output is correct
35 Correct 136 ms 309332 KB Output is correct
36 Correct 138 ms 309332 KB Output is correct
37 Correct 135 ms 309080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 296368 KB Output is correct
2 Correct 110 ms 297556 KB Output is correct
3 Correct 103 ms 297556 KB Output is correct
4 Correct 101 ms 297468 KB Output is correct
5 Correct 115 ms 297556 KB Output is correct
6 Correct 109 ms 297556 KB Output is correct
7 Correct 108 ms 297200 KB Output is correct
8 Correct 108 ms 296788 KB Output is correct
9 Correct 107 ms 297428 KB Output is correct
10 Correct 115 ms 297540 KB Output is correct
11 Correct 106 ms 297552 KB Output is correct
12 Correct 107 ms 297556 KB Output is correct
13 Correct 116 ms 296216 KB Output is correct
14 Correct 111 ms 296532 KB Output is correct
15 Correct 114 ms 296528 KB Output is correct
16 Correct 102 ms 296272 KB Output is correct
17 Correct 115 ms 300372 KB Output is correct
18 Correct 121 ms 300368 KB Output is correct
19 Correct 122 ms 300372 KB Output is correct
20 Correct 118 ms 300116 KB Output is correct
21 Correct 114 ms 300112 KB Output is correct
22 Correct 121 ms 300116 KB Output is correct
23 Correct 123 ms 300120 KB Output is correct
24 Correct 124 ms 299220 KB Output is correct
25 Correct 131 ms 310688 KB Output is correct
26 Correct 128 ms 310480 KB Output is correct
27 Correct 142 ms 310548 KB Output is correct
28 Correct 128 ms 308844 KB Output is correct
29 Correct 139 ms 309332 KB Output is correct
30 Correct 136 ms 309332 KB Output is correct
31 Correct 138 ms 309332 KB Output is correct
32 Correct 135 ms 309080 KB Output is correct
33 Correct 114 ms 296272 KB Output is correct
34 Correct 106 ms 296400 KB Output is correct
35 Correct 113 ms 297556 KB Output is correct
36 Correct 119 ms 297300 KB Output is correct
37 Correct 120 ms 296572 KB Output is correct
38 Correct 234 ms 392784 KB Output is correct
39 Correct 216 ms 385304 KB Output is correct
40 Correct 211 ms 385108 KB Output is correct
41 Correct 1081 ms 377444 KB Output is correct
42 Correct 230 ms 406612 KB Output is correct
43 Correct 238 ms 406572 KB Output is correct
44 Correct 242 ms 406536 KB Output is correct
45 Correct 233 ms 399792 KB Output is correct
46 Correct 210 ms 383828 KB Output is correct
47 Correct 237 ms 386296 KB Output is correct
48 Correct 288 ms 391308 KB Output is correct
49 Correct 277 ms 391396 KB Output is correct
50 Correct 199 ms 354388 KB Output is correct
51 Correct 216 ms 346704 KB Output is correct
52 Correct 291 ms 390224 KB Output is correct
53 Correct 270 ms 390280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 115 ms 318032 KB Output is correct
2 Correct 105 ms 314636 KB Output is correct
3 Correct 112 ms 317776 KB Output is correct
4 Correct 115 ms 296276 KB Output is correct
5 Correct 109 ms 317776 KB Output is correct
6 Correct 114 ms 317776 KB Output is correct
7 Correct 108 ms 317796 KB Output is correct
8 Correct 114 ms 317980 KB Output is correct
9 Correct 113 ms 317780 KB Output is correct
10 Correct 113 ms 317012 KB Output is correct
11 Correct 109 ms 317608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 296272 KB Output is correct
2 Correct 106 ms 296400 KB Output is correct
3 Correct 113 ms 297556 KB Output is correct
4 Correct 119 ms 297300 KB Output is correct
5 Correct 120 ms 296572 KB Output is correct
6 Correct 108 ms 296692 KB Output is correct
7 Correct 646 ms 697684 KB Output is correct
8 Runtime error 957 ms 1048576 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 296368 KB Output is correct
2 Correct 110 ms 297556 KB Output is correct
3 Correct 103 ms 297556 KB Output is correct
4 Correct 101 ms 297468 KB Output is correct
5 Correct 115 ms 297556 KB Output is correct
6 Correct 109 ms 297556 KB Output is correct
7 Correct 108 ms 297200 KB Output is correct
8 Correct 108 ms 296788 KB Output is correct
9 Correct 107 ms 297428 KB Output is correct
10 Correct 115 ms 297540 KB Output is correct
11 Correct 106 ms 297552 KB Output is correct
12 Correct 107 ms 297556 KB Output is correct
13 Correct 116 ms 296216 KB Output is correct
14 Correct 111 ms 296532 KB Output is correct
15 Correct 114 ms 296528 KB Output is correct
16 Correct 102 ms 296272 KB Output is correct
17 Correct 115 ms 300372 KB Output is correct
18 Correct 121 ms 300368 KB Output is correct
19 Correct 122 ms 300372 KB Output is correct
20 Correct 118 ms 300116 KB Output is correct
21 Correct 114 ms 300112 KB Output is correct
22 Correct 121 ms 300116 KB Output is correct
23 Correct 123 ms 300120 KB Output is correct
24 Correct 124 ms 299220 KB Output is correct
25 Correct 131 ms 310688 KB Output is correct
26 Correct 128 ms 310480 KB Output is correct
27 Correct 142 ms 310548 KB Output is correct
28 Correct 128 ms 308844 KB Output is correct
29 Correct 139 ms 309332 KB Output is correct
30 Correct 136 ms 309332 KB Output is correct
31 Correct 138 ms 309332 KB Output is correct
32 Correct 135 ms 309080 KB Output is correct
33 Correct 234 ms 392784 KB Output is correct
34 Correct 216 ms 385304 KB Output is correct
35 Correct 211 ms 385108 KB Output is correct
36 Correct 1081 ms 377444 KB Output is correct
37 Correct 230 ms 406612 KB Output is correct
38 Correct 238 ms 406572 KB Output is correct
39 Correct 242 ms 406536 KB Output is correct
40 Correct 233 ms 399792 KB Output is correct
41 Correct 210 ms 383828 KB Output is correct
42 Correct 237 ms 386296 KB Output is correct
43 Correct 288 ms 391308 KB Output is correct
44 Correct 277 ms 391396 KB Output is correct
45 Correct 199 ms 354388 KB Output is correct
46 Correct 216 ms 346704 KB Output is correct
47 Correct 291 ms 390224 KB Output is correct
48 Correct 270 ms 390280 KB Output is correct
49 Correct 115 ms 318032 KB Output is correct
50 Correct 105 ms 314636 KB Output is correct
51 Correct 112 ms 317776 KB Output is correct
52 Correct 115 ms 296276 KB Output is correct
53 Correct 109 ms 317776 KB Output is correct
54 Correct 114 ms 317776 KB Output is correct
55 Correct 108 ms 317796 KB Output is correct
56 Correct 114 ms 317980 KB Output is correct
57 Correct 113 ms 317780 KB Output is correct
58 Correct 113 ms 317012 KB Output is correct
59 Correct 109 ms 317608 KB Output is correct
60 Correct 108 ms 296692 KB Output is correct
61 Correct 646 ms 697684 KB Output is correct
62 Runtime error 957 ms 1048576 KB Execution killed with signal 9
63 Halted 0 ms 0 KB -