#include<bits/stdc++.h>
#include "quality.h"
using namespace std;
const int MAXN=3005;
const int INF=1e9+5;
int n,m;
int h,w;
int half;
int pref[MAXN][MAXN];
int minPoss1[MAXN][MAXN];
int minPoss2[MAXN][MAXN];
bool check(int x,int q[][3001])
{
pref[0][0]=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(i>0 && j>0) pref[i][j]=pref[i-1][j]+pref[i][j-1]-pref[i-1][j-1];
else if(i>0) pref[i][j]=pref[i-1][j];
else if(j>0) pref[i][j]=pref[i][j-1];
if(q[i][j]<x) pref[i][j]++;
if(i>=h-1 && j>=w-1)
{
int a1=0,a2=0,b=0;
if(i>=h) a1=pref[i-h][j];
if(j>=w) a2=pref[i][j-w];
if(i>=h && j>=w) b=pref[i-h][j-w];
if(pref[i][j]-a1-a2+b>=half) return 1;
}
}
}
return 0;
}
int find_ans(int x,int q[][3001])
{
deque<int> dq;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{//if(q[i][j]==x) cout<<i<<" "<<j<<endl;
while(!dq.empty() && dq.front()<=j-w) dq.pop_front();
if(q[i][j]>=x)
{
while(!dq.empty() && q[i][j]<q[i][dq.back()]) dq.pop_back();
dq.push_back(j);
}
if(!dq.empty()) minPoss1[i][j]=q[i][dq.front()]; //
else minPoss1[i][j]=INF;
//if(minPoss[i][j]==x) cout<<i<<" "<<j<<endl;
}
while(!dq.empty()) dq.pop_back();
}
for(int j=0;j<m;j++)
{
for(int i=0;i<n;i++)
{
while(!dq.empty() && dq.front()<=i-h) dq.pop_front();
if(minPoss1[i][j]>=x)
{
while(!dq.empty() && minPoss1[i][j]<minPoss1[dq.back()][j]) dq.pop_back();
dq.push_back(i);
}
if(!dq.empty()) minPoss2[i][j]=minPoss1[dq.front()][j];
else minPoss2[i][j]=INF;
//if(minPoss[i][j]==x) cout<<i<<" "<<j<<" "<<dq.front()<<endl;
}
while(!dq.empty()) dq.pop_back();
}
int ans=INF;
pref[0][0]=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(i>0 && j>0) pref[i][j]=pref[i-1][j]+pref[i][j-1]-pref[i-1][j-1];
else if(i>0) pref[i][j]=pref[i-1][j];
else if(j>0) pref[i][j]=pref[i][j-1];
if(q[i][j]<x) pref[i][j]++;
if(i>=h-1 && j>=w-1)
{
int a1=0,a2=0,b=0;
if(i>=h) a1=pref[i-h][j];
if(j>=w) a2=pref[i][j-w];
if(i>=h && j>=w) b=pref[i-h][j-w];
if(pref[i][j]-a1-a2+b>=half) ans=min(ans, minPoss2[i][j]); // cout<<pref[i][j]-a1-a2+b<<" "<<minPoss2[i][j]<<" "<<i<<" "<<j<<endl;
}
}
}
return ans;
}
int rectangle(int R,int C,int H,int W,int q[3001][3001])
{
n=R, m=C;
h=H, w=W;
half=h*w/2;
int l=1,r=n*m;
while(l<r)
{
int mid=(l+r)/2;
if(check(mid,q)) r=mid;
else l=mid+1;
}
//cout<<l<<endl;
return find_ans(l,q);
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
724 KB |
Output is correct |
2 |
Correct |
1 ms |
724 KB |
Output is correct |
3 |
Correct |
1 ms |
724 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
724 KB |
Output is correct |
2 |
Correct |
1 ms |
724 KB |
Output is correct |
3 |
Correct |
1 ms |
724 KB |
Output is correct |
4 |
Correct |
2 ms |
2000 KB |
Output is correct |
5 |
Correct |
3 ms |
2004 KB |
Output is correct |
6 |
Correct |
3 ms |
2008 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
724 KB |
Output is correct |
2 |
Correct |
1 ms |
724 KB |
Output is correct |
3 |
Correct |
1 ms |
724 KB |
Output is correct |
4 |
Correct |
2 ms |
2000 KB |
Output is correct |
5 |
Correct |
3 ms |
2004 KB |
Output is correct |
6 |
Correct |
3 ms |
2008 KB |
Output is correct |
7 |
Correct |
18 ms |
6996 KB |
Output is correct |
8 |
Correct |
19 ms |
7008 KB |
Output is correct |
9 |
Correct |
16 ms |
6864 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
724 KB |
Output is correct |
2 |
Correct |
1 ms |
724 KB |
Output is correct |
3 |
Correct |
1 ms |
724 KB |
Output is correct |
4 |
Correct |
2 ms |
2000 KB |
Output is correct |
5 |
Correct |
3 ms |
2004 KB |
Output is correct |
6 |
Correct |
3 ms |
2008 KB |
Output is correct |
7 |
Correct |
18 ms |
6996 KB |
Output is correct |
8 |
Correct |
19 ms |
7008 KB |
Output is correct |
9 |
Correct |
16 ms |
6864 KB |
Output is correct |
10 |
Correct |
215 ms |
38624 KB |
Output is correct |
11 |
Correct |
218 ms |
38656 KB |
Output is correct |
12 |
Correct |
106 ms |
27392 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
724 KB |
Output is correct |
2 |
Correct |
1 ms |
724 KB |
Output is correct |
3 |
Correct |
1 ms |
724 KB |
Output is correct |
4 |
Correct |
2 ms |
2000 KB |
Output is correct |
5 |
Correct |
3 ms |
2004 KB |
Output is correct |
6 |
Correct |
3 ms |
2008 KB |
Output is correct |
7 |
Correct |
18 ms |
6996 KB |
Output is correct |
8 |
Correct |
19 ms |
7008 KB |
Output is correct |
9 |
Correct |
16 ms |
6864 KB |
Output is correct |
10 |
Correct |
215 ms |
38624 KB |
Output is correct |
11 |
Correct |
218 ms |
38656 KB |
Output is correct |
12 |
Correct |
106 ms |
27392 KB |
Output is correct |
13 |
Correct |
2350 ms |
210760 KB |
Output is correct |
14 |
Correct |
2309 ms |
210740 KB |
Output is correct |
15 |
Correct |
2133 ms |
203524 KB |
Output is correct |