This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "quality.h"
#include <bits/stdc++.h>
using namespace std;
int r,c,h,w;
int need;
vector<vector<int>> q;
vector<vector<int>> raw;
vector<vector<int>> pref;
void prefsum() {
pref=vector<vector<int>>(r+1, vector<int>(c+1,0));
for (int i=1; i<=r; i++) {
for (int j=1; j<=c; j++) {
pref[i][j] = pref[i-1][j] + pref[i][j-1] - pref[i-1][j-1] + raw[i-1][j-1];
}
}
}
int getrect(int x1, int y1, int x2, int y2) {
//x1,y1 < x2,y2
x2++;
y2++;
return pref[x2][y2]-pref[x2][y1]-pref[x1][y2]+pref[x1][y1];
}
bool BSTA(int x) {
for (int i=0; i<r; i++) {
for (int j=0; j<c; j++) {
raw[i][j] = (q[i][j]<x);
}
}
prefsum();
bool work=0;
for (int i=0; i<r-h+1; i++) {
for (int j=0; j<c-w+1; j++) {
int p = (getrect(i,j,i+h-1, j+w-1)>=need);
//cout << x <<" " << i <<" " << j << " " << i+h <<" " << j+w <<" " << need <<" " << getrect(i,j,i+h-1, j+w-1)<< endl;
work |= p;
}
}
return work;
}
int rectangle(int R, int C, int H, int W, int Q[3001][3001]) {
r=R;
c=C;
h=H;
w=W;
need = h*w;
need/=2;
q=vector<vector<int>>(R,vector<int>(C,0));
for (int i=0; i<R; i++) {
for (int j=0; j<C; j++) {
q[i][j] = Q[i][j];
}
}
raw=vector<vector<int>>(r,vector<int>(c,0));
int l=1;
int r=R*C;
while (l<r) {
int m=(l+r)/2;
int b=BSTA(m);
//cout << "res" << " " << m <<" " << b << endl << endl;
if (b) {
l=l;
r=m;
}
else {
l=m+1;
r=r;
}
}
if (BSTA(l+1))return l+1;
return l;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |