Submission #1129626

#TimeUsernameProblemLanguageResultExecution timeMemory
1129626c0det1gerMosaic (IOI24_mosaic)C++20
100 / 100
425 ms55812 KiB
#include <bits/stdc++.h>
using namespace std;
 
//#define int long long
#define double long double

vector<long long> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R){
    if (X.size() <= 3){
        vector<vector<int>> pre(X.size() + 1, vector<int>(X.size() + 1));
        vector<vector<int>> real(X.size() + 1, vector<int>(X.size() + 1));
        for (int i = 1; i <= X.size(); i++){
            real[1][i] = X[i - 1];
            real[i][1] = Y[i - 1];
        }
        for (int i = 2; i <= X.size(); i++){
            for (int j = 2; j<= X.size(); j++){
                real[i][j] = 1 - max(real[i - 1][j], real[i][j - 1]);
            }
        }
        for (int i = 1; i <= X.size(); i++){
            for (int j = 1; j <= X.size(); j++){
                pre[i][j] = pre[i][j - 1] + pre[i - 1][j] - pre[i - 1][j - 1] + real[i][j];
            }
        }
        vector<long long> ans;
        for (int i = 0; i < T.size(); i++){
            R[i]++;
            B[i]++;
            ans.push_back(pre[B[i]][R[i]] - pre[T[i]][R[i]] - pre[B[i]][L[i]] + pre[T[i]][L[i]]);
        }
        return ans;
    }
    else{
        vector<long long> ans;
        map<int, long long> mp;
        vector<int> x(X.size()), y(X.size());
        x[0] = Y[1];
        for (int i = 1; i < X.size(); i++){
            x[i] = 1 - max(X[i], x[i - 1]);
        }
        y[0] = X[1];
        for (int i = 1; i < Y.size(); i++){
            y[i] = 1 - max(Y[i], y[i - 1]);
        }
        
        vector<int> xx(X.size()), yy(X.size());
        xx[1] = y[2];
        for (int i = 2; i < X.size(); i++){
            xx[i] = 1 - max(x[i], xx[i - 1]);
        }
        yy[1] = x[2];
        for (int i = 2; i < Y.size(); i++){
            yy[i] = 1 - max(y[i], yy[i - 1]);
        }
        
        for (int i = 2; i < X.size(); i++){
            mp[i - 2] = yy[i];
            mp[-i + 2] = xx[i];
        }
        
        int sz = (int)X.size();
        vector<long long> pre(2 * sz), pre1(2 * sz), pre2(2 * sz + 1);

        mp[sz - 2] = x[sz - 1];
        mp[sz - 1] = X[sz - 1];
        mp[-sz + 2] = y[sz - 1];
        mp[-sz + 1] = Y[sz - 1];
        
        for (int i = 1; i < 2 * sz; i++){
            pre[i] = pre[i - 1] + mp[i - sz];
            pre1[i] = pre1[i - 1] + mp[i - sz] * i;
        }
        for (int i = 2 * sz - 1; i >= 1; i--){
            pre2[i] = pre2[i + 1] + mp[i - sz] * (2 * sz - i);
        }
        
        vector<long long> p1x(sz + 1), p2x(sz + 1), p1y(sz + 1), p2y(sz + 1);
        
        for (int i = 1; i <= sz; i++){
            p1x[i] = p1x[i - 1] + X[i - 1];
            p2x[i] = p2x[i - 1] + x[i - 1];
            p1y[i] = p1y[i - 1] + Y[i - 1];
            p2y[i] = p2y[i - 1] + y[i - 1];
        }
        
        for (int i = 0; i < T.size(); i++){
            long long res = 0;
            
            int t = T[i], b = B[i], l = L[i], r = R[i];
            if (t == 0){
                res += p1x[r + 1] - p1x[l];
                t++;
            }
            if (t == 1){
                res += p2x[r + 1] - p2x[l];
                t++;
            }
            if (b == 0){
                ans.push_back(p1x[r + 1] - p1x[l]);
                continue;
            }
            if (b == 1){
                ans.push_back(res);
                continue;
            }
            
            if (l == 0){
                res += p1y[b + 1] - p1y[t];
                l++;
            }
            if (r == 0){
                ans.push_back(res);
                continue;
            }
            if (l == 1){
                res += p2y[b + 1] - p2y[t];
                l++;
            }
            if (r == 1){
                ans.push_back(res);
                continue;
            }
            
            int lft1 = sz + (b - l) + 1;
            int ext1 = min((r - l) + 1, (b - t) + 1);
            int rgt1 = lft1 - ext1;
            res += pre2[rgt1] - pre2[lft1] - (pre[lft1 - 1] - pre[rgt1 - 1]) * (2 * sz - lft1);
            //cout << pre[lft1] - pre[rgt1] << "\n";
            int rgt2 = sz + (t - r) - 1;
            int lft2 = rgt2 + ext1;
            res += pre1[lft2] - pre1[rgt2] - (pre[lft2] - pre[rgt2]) * (rgt2);
            //cout << lft2 << "\n";
            res += (pre[rgt1 - 1] - pre[lft2]) * ext1;
            ans.push_back(res);
        }
        
        return ans;
    }
    return {};
}

/*
 ____   ___    ___     ____  _____          ____    ____   ___
|      |   |  |   \   |        |     /|    |       |      |   \
|      |   |  |    |  |____    |      |    |   _   |____  |___/
|      |   |  |    |  |        |      |    |    |  |      |  \
|____  |___|  |___/   |____    |    __|__  |____|  |____  |   \
 
*/
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...