Submission #1073457

# Submission time Handle Problem Language Result Execution time Memory
1073457 2024-08-24T14:58:47 Z HorizonWest Soccer Stadium (IOI23_soccer) C++17
77.5 / 100
3659 ms 943836 KB
#include <iostream>
#include <complex>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <functional>
#include <bitset>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
#include <cstdint>
#include <cassert>
using namespace std;

const int Max = 3001, Inf = 1e9, TLE = 2e6;

#define ll unsigned long long

int lg[Max], cnt; 

struct SPTMIN
{
    vector <vector <int>> spt; 

    int query(int i, int j){
        int x = lg[j-i+1];
        return min(spt[i][x], spt[j - (1LL << x) + 1][x]);
    }

    SPTMIN(vector <int> v)
    {
        int n = v.size();
        spt.assign(n + 1, vector <int> (lg[n] + 1, Inf));

        for(int j = 0; j < lg[n]+1; j++)
        {
            for(int i = 0; i < n; i++){
                if(j == 0){
                    spt[i][j] = v[i];
                    continue;
                }
                spt[i][j] = spt[i][j-1];
                if(i + (1LL << (j-1)) < n) spt[i][j] = min(spt[i][j-1], spt[i + (1LL << (j-1))][j-1]);
            }
        }
    }
};

struct SPTMAX
{
    vector <vector <int>> spt; 

    int query(int i, int j){
        int x = lg[j-i+1];
        return max(spt[i][x], spt[j - (1LL << x) + 1][x]);
    }

    SPTMAX(vector <int> v)
    {
        int n = v.size();
        spt.assign(n + 1, vector <int> (lg[n] + 1, 0));

        for(int j = 0; j < lg[n]+1; j++)
        {
            for(int i = 0; i < n; i++){
                if(j == 0){
                    spt[i][j] = v[i];
                    continue;
                }
                spt[i][j] = spt[i][j-1];
                if(i + (1LL << (j-1)) < n) spt[i][j] = max(spt[i][j-1], spt[i + (1LL << (j-1))][j-1]);
            }
        }
    }
};

int rnd(){
  	return abs(int(rand() ^ (rand() << 3LL) ^ (rand() << 6LL)));
}

int biggest_stadium(int n, std::vector<std::vector<int>> f)
{
    vector <vector<int>> A(n, vector <int> (n, 0)),
        B(n, vector <int> (n, 0)),
        C(n, vector <int> (n, 0)),
        D(n, vector <int> (n, 0)), 
        T(n, vector <int> (n, 0)); 

    vector <SPTMIN> sp1;
    vector <SPTMAX> sp2;

    cnt = 0;

    for(int i = 1; i <= n; i++){
        lg[i] = log2(i);
    }

    for(int i = 0; i < n; i++)
    {
        int last = -1; 
        for(int j = 0; j < n; j++){
            if(f[i][j] == 1) last = j; 
            A[i][j] = last;
        }   

        last = n;
        for(int j = n-1; j >= 0; j--){
            T[i][j] = last;
            if(f[i][j] == 1) {      
                if(j != n-1 && last == j+1){
                    T[i][j] = T[i][j+1];
                }else T[i][j] = j;
                last = j;
            } 
            B[i][j] = last;
        }     
    }

    for(int i = 0; i < n; i++)
    {
        int last = -1; 
        for(int j = 0; j < n; j++){
            if(f[j][i] == 1) last = j; 
            C[j][i] = last+1;
        }   

        last = n;
        for(int j = n-1; j >= 0; j--){
            if(f[j][i] == 1) last = j; 
            D[j][i] = last-1;
        }     
    }

    for(int i = 0; i < n; i++)
    {
        sp1.push_back(SPTMIN(D[i]));
        sp2.push_back(SPTMAX(C[i]));
    }
    
    //return 0;

    //vector <vector<vector<int>>> dp1(n + 1, vector <vector<int>> 
    //    (n + 1, vector <int> (n + 1, -1)));

    //vector <vector<vector<int>>> dp2(n + 1, vector <vector<int>> 
    //    (n + 1, vector <int> (n + 1, -1)));

    unordered_map <ll, int> dp; 

    auto F = [&](auto F, int i, int j, int a, int b, int c, int d) -> int 
    {   cnt++;

        long long x = ((ll) b) + (((ll) c) << 11LL) + (((ll) d) << 22LL) + (((ll) j) << 33LL) 
                               + (((ll) i) << 44LL) + (((ll) a) << 55LL);
        
        if(dp[x] != 0) return dp[x];
        dp[x] = (b - a + 1); 
        if(i != j) dp[x] += (d - c + 1);

        int mx = 0;

        if(i != 0)
        {
            for(int k = a; k <= b; k++) if(f[i-1][k] == 0)
            {
                int l1 = max(A[i-1][k]+1, a), r1 = min(B[i-1][k]-1, b);
                int l2 = max(c, l1), r2 =  min(d, r1);

                int ni = sp2[i].query(l1, r1), d = abs(ni - i) - 1, t = (r1 - l1 + 1);

                mx = max(mx, F(F, ni, j, l1, r1, l2, r2) - (r2 - l2 + 1) + d * t);

                k = r1;
            } else k = T[i-1][k];
        }

        if(j != n-1)
        {
            for(int k = c; k <= d; k++) if(f[j+1][k] == 0)
            {
                int l2 = max(A[j+1][k]+1, c), r2 = min(B[j+1][k]-1, d);
                int l1 = max(a, l2), r1 =  min(b, r2);

                int nj = sp1[j].query(l2, r2), d = abs(nj - j) - 1, t = (r2 - l2 + 1);

                mx = max(mx, F(F, i, nj, l1, r1, l2, r2) - (r1 - l1 + 1) + d * t);

                k = r2;
            } else k = T[j+1][k];
        }

        return dp[x] = (dp[x] + mx);
    };      
    
    int ans = 0; 
  	
  	srand(time(NULL));
  	vector <pair<int, pair<int, int>>> fx; 
  
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(f[i][j] == 1) continue; 
            int l = A[i][j]+1, r = B[i][j]-1;

            int ni = sp2[i].query(j, j);
            int nj = sp1[i].query(j, j);

            int d = r-l+1, h = (nj - ni + 1);
            fx.push_back({ d + h, { i, j }});
        }
    }
  	
    sort(fx.begin(), fx.end());

  	while (fx.size() > 0)
    {
        pair<int, int> u = fx.back().second; fx.pop_back();
        int i = u.first, j = u.second; 
        
        if(f[i][j] == 1) continue; 
        
        int l = A[i][j]+1, r = B[i][j]-1;

        ans = max(ans, F(F, i, i, l, r, l, r));

        if(n > 500 && cnt > TLE) {
            break;
        }
    }

    int mod = fx.size(); cnt = 0;
    

    for(int i = 0; i < (int) fx.size(); i++){
        int x = rnd() % mod;
        swap(fx[i], fx[x]);
    }

    while (fx.size() > 0)
    {
        pair<int, int> u = fx.back().second; fx.pop_back();
        int i = u.first, j = u.second; 
        
        if(f[i][j] == 1) continue; 
        
        int l = A[i][j]+1, r = B[i][j]-1;

        ans = max(ans, F(F, i, i, l, r, l, r));

        if(n > 500 && cnt > TLE) {
            break;
        }
    }

    return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB ok
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB ok
2 Correct 1 ms 436 KB ok
3 Correct 0 ms 348 KB ok
4 Correct 0 ms 348 KB ok
5 Correct 0 ms 348 KB ok
6 Correct 0 ms 348 KB ok
7 Correct 4 ms 2392 KB ok
8 Correct 84 ms 46396 KB ok
9 Correct 1769 ms 858036 KB ok
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB ok
2 Correct 1 ms 436 KB ok
3 Correct 0 ms 348 KB ok
4 Correct 0 ms 348 KB ok
5 Correct 1 ms 348 KB ok
6 Correct 0 ms 348 KB ok
7 Correct 0 ms 388 KB ok
8 Correct 0 ms 348 KB ok
9 Correct 0 ms 348 KB ok
10 Correct 0 ms 348 KB ok
11 Correct 1 ms 348 KB ok
12 Correct 0 ms 348 KB ok
13 Correct 0 ms 348 KB ok
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB ok
2 Correct 1 ms 344 KB ok
3 Correct 1 ms 436 KB ok
4 Correct 0 ms 348 KB ok
5 Correct 0 ms 348 KB ok
6 Correct 1 ms 348 KB ok
7 Correct 0 ms 348 KB ok
8 Correct 0 ms 388 KB ok
9 Correct 0 ms 348 KB ok
10 Correct 0 ms 348 KB ok
11 Correct 0 ms 348 KB ok
12 Correct 1 ms 348 KB ok
13 Correct 0 ms 348 KB ok
14 Correct 0 ms 348 KB ok
15 Correct 0 ms 432 KB ok
16 Correct 1 ms 348 KB ok
17 Correct 0 ms 344 KB ok
18 Correct 1 ms 348 KB ok
19 Correct 1 ms 348 KB ok
20 Correct 1 ms 348 KB ok
21 Correct 1 ms 348 KB ok
22 Correct 1 ms 348 KB ok
23 Correct 0 ms 348 KB ok
24 Correct 1 ms 348 KB ok
25 Correct 0 ms 348 KB ok
26 Correct 0 ms 348 KB ok
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB ok
2 Correct 1 ms 344 KB ok
3 Correct 1 ms 436 KB ok
4 Correct 0 ms 348 KB ok
5 Correct 0 ms 348 KB ok
6 Correct 0 ms 348 KB ok
7 Correct 0 ms 348 KB ok
8 Correct 1 ms 348 KB ok
9 Correct 0 ms 348 KB ok
10 Correct 0 ms 388 KB ok
11 Correct 0 ms 348 KB ok
12 Correct 0 ms 348 KB ok
13 Correct 0 ms 348 KB ok
14 Correct 1 ms 348 KB ok
15 Correct 0 ms 348 KB ok
16 Correct 0 ms 348 KB ok
17 Correct 0 ms 432 KB ok
18 Correct 1 ms 348 KB ok
19 Correct 0 ms 344 KB ok
20 Correct 1 ms 348 KB ok
21 Correct 1 ms 348 KB ok
22 Correct 1 ms 348 KB ok
23 Correct 1 ms 348 KB ok
24 Correct 1 ms 348 KB ok
25 Correct 0 ms 348 KB ok
26 Correct 1 ms 348 KB ok
27 Correct 0 ms 348 KB ok
28 Correct 0 ms 348 KB ok
29 Correct 0 ms 344 KB ok
30 Correct 1 ms 600 KB ok
31 Correct 1 ms 600 KB ok
32 Correct 1 ms 344 KB ok
33 Correct 1 ms 348 KB ok
34 Correct 1 ms 348 KB ok
35 Correct 1 ms 344 KB ok
36 Correct 0 ms 348 KB ok
37 Correct 1 ms 348 KB ok
38 Correct 1 ms 348 KB ok
39 Correct 1 ms 348 KB ok
40 Correct 1 ms 348 KB ok
41 Correct 1 ms 604 KB ok
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB ok
2 Correct 1 ms 344 KB ok
3 Correct 1 ms 436 KB ok
4 Correct 0 ms 348 KB ok
5 Correct 0 ms 348 KB ok
6 Correct 0 ms 348 KB ok
7 Correct 0 ms 348 KB ok
8 Correct 1 ms 348 KB ok
9 Correct 0 ms 348 KB ok
10 Correct 0 ms 388 KB ok
11 Correct 0 ms 348 KB ok
12 Correct 0 ms 348 KB ok
13 Correct 0 ms 348 KB ok
14 Correct 1 ms 348 KB ok
15 Correct 0 ms 348 KB ok
16 Correct 0 ms 348 KB ok
17 Correct 0 ms 432 KB ok
18 Correct 1 ms 348 KB ok
19 Correct 0 ms 344 KB ok
20 Correct 1 ms 348 KB ok
21 Correct 1 ms 348 KB ok
22 Correct 1 ms 348 KB ok
23 Correct 1 ms 348 KB ok
24 Correct 1 ms 348 KB ok
25 Correct 0 ms 348 KB ok
26 Correct 1 ms 348 KB ok
27 Correct 0 ms 348 KB ok
28 Correct 0 ms 348 KB ok
29 Correct 0 ms 344 KB ok
30 Correct 1 ms 600 KB ok
31 Correct 1 ms 600 KB ok
32 Correct 1 ms 344 KB ok
33 Correct 1 ms 348 KB ok
34 Correct 1 ms 348 KB ok
35 Correct 1 ms 344 KB ok
36 Correct 0 ms 348 KB ok
37 Correct 1 ms 348 KB ok
38 Correct 1 ms 348 KB ok
39 Correct 1 ms 348 KB ok
40 Correct 1 ms 348 KB ok
41 Correct 1 ms 604 KB ok
42 Correct 296 ms 59164 KB ok
43 Correct 204 ms 56768 KB ok
44 Correct 384 ms 65332 KB ok
45 Correct 298 ms 65472 KB ok
46 Correct 358 ms 65344 KB ok
47 Correct 96 ms 46788 KB ok
48 Correct 112 ms 49352 KB ok
49 Correct 111 ms 47728 KB ok
50 Correct 126 ms 58304 KB ok
51 Correct 156 ms 55492 KB ok
52 Correct 71 ms 45148 KB ok
53 Correct 60 ms 43632 KB ok
54 Correct 87 ms 44880 KB ok
55 Correct 102 ms 46332 KB ok
56 Correct 69 ms 45016 KB ok
57 Correct 146 ms 55748 KB ok
58 Correct 169 ms 55744 KB ok
59 Correct 166 ms 55712 KB ok
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB ok
2 Correct 1 ms 344 KB ok
3 Correct 1 ms 436 KB ok
4 Correct 0 ms 348 KB ok
5 Correct 0 ms 348 KB ok
6 Correct 0 ms 348 KB ok
7 Correct 0 ms 348 KB ok
8 Correct 4 ms 2392 KB ok
9 Correct 84 ms 46396 KB ok
10 Correct 1769 ms 858036 KB ok
11 Correct 0 ms 348 KB ok
12 Correct 0 ms 348 KB ok
13 Correct 1 ms 348 KB ok
14 Correct 0 ms 348 KB ok
15 Correct 0 ms 388 KB ok
16 Correct 0 ms 348 KB ok
17 Correct 0 ms 348 KB ok
18 Correct 0 ms 348 KB ok
19 Correct 1 ms 348 KB ok
20 Correct 0 ms 348 KB ok
21 Correct 0 ms 348 KB ok
22 Correct 0 ms 432 KB ok
23 Correct 1 ms 348 KB ok
24 Correct 0 ms 344 KB ok
25 Correct 1 ms 348 KB ok
26 Correct 1 ms 348 KB ok
27 Correct 1 ms 348 KB ok
28 Correct 1 ms 348 KB ok
29 Correct 1 ms 348 KB ok
30 Correct 0 ms 348 KB ok
31 Correct 1 ms 348 KB ok
32 Correct 0 ms 348 KB ok
33 Correct 0 ms 348 KB ok
34 Correct 0 ms 344 KB ok
35 Correct 1 ms 600 KB ok
36 Correct 1 ms 600 KB ok
37 Correct 1 ms 344 KB ok
38 Correct 1 ms 348 KB ok
39 Correct 1 ms 348 KB ok
40 Correct 1 ms 344 KB ok
41 Correct 0 ms 348 KB ok
42 Correct 1 ms 348 KB ok
43 Correct 1 ms 348 KB ok
44 Correct 1 ms 348 KB ok
45 Correct 1 ms 348 KB ok
46 Correct 1 ms 604 KB ok
47 Correct 296 ms 59164 KB ok
48 Correct 204 ms 56768 KB ok
49 Correct 384 ms 65332 KB ok
50 Correct 298 ms 65472 KB ok
51 Correct 358 ms 65344 KB ok
52 Correct 96 ms 46788 KB ok
53 Correct 112 ms 49352 KB ok
54 Correct 111 ms 47728 KB ok
55 Correct 126 ms 58304 KB ok
56 Correct 156 ms 55492 KB ok
57 Correct 71 ms 45148 KB ok
58 Correct 60 ms 43632 KB ok
59 Correct 87 ms 44880 KB ok
60 Correct 102 ms 46332 KB ok
61 Correct 69 ms 45016 KB ok
62 Correct 146 ms 55748 KB ok
63 Correct 169 ms 55744 KB ok
64 Correct 166 ms 55712 KB ok
65 Correct 3585 ms 938296 KB ok
66 Correct 2124 ms 873068 KB ok
67 Correct 1449 ms 832208 KB ok
68 Correct 3311 ms 937296 KB ok
69 Partially correct 3286 ms 942312 KB partial
70 Correct 3659 ms 941232 KB ok
71 Correct 3253 ms 938804 KB ok
72 Correct 1746 ms 865528 KB ok
73 Correct 2390 ms 888292 KB ok
74 Correct 2560 ms 911268 KB ok
75 Correct 2260 ms 887732 KB ok
76 Correct 1701 ms 923292 KB ok
77 Correct 1689 ms 922932 KB ok
78 Correct 2454 ms 933028 KB ok
79 Correct 1080 ms 820120 KB ok
80 Correct 1104 ms 820672 KB ok
81 Correct 1290 ms 833724 KB ok
82 Correct 2137 ms 866496 KB ok
83 Correct 1903 ms 857716 KB ok
84 Correct 1117 ms 823044 KB ok
85 Correct 992 ms 815040 KB ok
86 Correct 1195 ms 834632 KB ok
87 Correct 1259 ms 836068 KB ok
88 Correct 1363 ms 840840 KB ok
89 Correct 1470 ms 856872 KB ok
90 Correct 1337 ms 857260 KB ok
91 Correct 1526 ms 858112 KB ok
92 Correct 1275 ms 825356 KB ok
93 Correct 1419 ms 832224 KB ok
94 Correct 1107 ms 816628 KB ok
95 Correct 1043 ms 815340 KB ok
96 Correct 985 ms 815432 KB ok
97 Correct 1002 ms 815436 KB ok
98 Correct 976 ms 810696 KB ok
99 Correct 2803 ms 936612 KB ok
100 Correct 2184 ms 942236 KB ok
101 Correct 2196 ms 941404 KB ok
102 Correct 2106 ms 941908 KB ok
103 Correct 2152 ms 942188 KB ok
104 Correct 2102 ms 941164 KB ok
105 Correct 2085 ms 941540 KB ok
106 Correct 1970 ms 939164 KB ok
107 Correct 2476 ms 943836 KB ok
108 Correct 3638 ms 928200 KB ok
109 Correct 3570 ms 929468 KB ok