Submission #1212351

#TimeUsernameProblemLanguageResultExecution timeMemory
1212351totoroQuality Of Living (IOI10_quality)C++20
100 / 100
1172 ms71016 KiB
#include "quality.h"

#include <iostream>
#include <vector>

int rectangle(int R, int C, int H, int W, int Q[3001][3001]) {
    int lo = 1, hi = R * C;
    while (lo < hi) {
        int mid = (lo + hi) / 2;
        std::vector<std::vector<int>> prefixsum(R + 1, std::vector<int>(C + 1));
        bool ok = false;
        for (int i = 0; i < R; ++i) {
            for (int j = 0; j < C; ++j) {
                prefixsum[i + 1][j + 1] = prefixsum[i][j + 1] + prefixsum[i + 1][j] + (Q[i][j] > mid) - prefixsum[i][j];
                // std::cout << "prefixsum[" << i + 1 << "][" << j + 1 << "]=" << prefixsum[i + 1][j + 1] << '\n';
                if (i + 1 >= H && j + 1 >= W) {
                    int val = prefixsum[i + 1][j + 1] + prefixsum[i + 1 - H][j + 1 - W] - prefixsum[i + 1 - H][j + 1] - prefixsum[i + 1][j + 1 - W];
                    // std::cout << "for mid=" << mid << " for i=" << i << " and j=" << j << " val is " << val << '\n';
                    ok |= (val <= H * W / 2);
                }
            }
        }
        if (ok) {
            hi = mid;
        } else {
            lo = mid + 1;
        }
    }
    return lo;
}
#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...