답안 #338083

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
338083 2020-12-22T12:50:16 Z Kerim 호화 벙커 (IZhO13_burrow) C++17
100 / 100
698 ms 21972 KB
#include "bits/stdc++.h"
#define MAXN 100009
#define INF 1000000007
#define mp(x,y) make_pair(x,y)
#define all(v) v.begin(),v.end()
#define pb(x) push_back(x)
#define wr cout<<"----------------"<<endl;
#define ppb() pop_back()
#define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++)
#define ff first
#define ss second
#define my_little_dodge 46
#define debug(x)  cerr<< #x <<" = "<< x<<endl;
using namespace std;

typedef long long ll;
typedef pair<int,int> PII;
template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;}
template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;}
const int N=1e3+4;
int arr[N][N],dp[N][N],ans;
int n,m,k,l[N],r[N];
int ok(int x){ans=0;
	for(int i=1;i<=n;i++){
		dp[i][0]=dp[i][m+1]=-1;
		stack<int>st;st.push(0);
		for(int j=1;j<=m;j++){
			if(arr[i][j]>=x)
				dp[i][j]=dp[i-1][j]+1;
			else
				dp[i][j]=0;
			while(!st.empty() and dp[i][st.top()]>=dp[i][j])			
				st.pop();
			l[j]=st.top()+1;st.push(j);
		}
		while(!st.empty())st.pop();st.push(m+1);
		for(int j=m;j>=1;j--){
			while(!st.empty() and dp[i][st.top()]>=dp[i][j])
				st.pop();
			r[j]=st.top()-1;st.push(j);
			umax(ans,(r[j]-l[j]+1)*dp[i][j]);	
		}
	}
	return (ans>=k);
}
int main(){
   // freopen("file.in", "r", stdin);
    scanf("%d%d%d",&n,&m,&k);
    vector<int>v;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		scanf("%d",&arr[i][j]),v.pb(arr[i][j]);
    sort(all(v));v.erase(unique(all(v)),v.end());
    int st=0,en=int(v.size())-1;
    while(st+1<en){
    	int mid=(st+en)>>1;
		if(ok(v[mid]))
			st=mid;
		else
			en=mid;	
    }
    if(ok(v[en]))st=en;
    else ok(v[st]);
    printf("%d %d\n",v[st],ans);
	return 0;
}

Compilation message

burrow.cpp: In function 'int ok(int)':
burrow.cpp:36:3: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   36 |   while(!st.empty())st.pop();st.push(m+1);
      |   ^~~~~
burrow.cpp:36:30: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   36 |   while(!st.empty())st.pop();st.push(m+1);
      |                              ^~
burrow.cpp: In function 'int main()':
burrow.cpp:48:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   48 |     scanf("%d%d%d",&n,&m,&k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
burrow.cpp:52:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   52 |       scanf("%d",&arr[i][j]),v.pb(arr[i][j]);
      |       ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 492 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 620 KB Output is correct
6 Correct 1 ms 620 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 5 ms 1260 KB Output is correct
9 Correct 10 ms 2284 KB Output is correct
10 Correct 24 ms 2536 KB Output is correct
11 Correct 45 ms 3304 KB Output is correct
12 Correct 22 ms 4844 KB Output is correct
13 Correct 30 ms 1896 KB Output is correct
14 Correct 75 ms 4832 KB Output is correct
15 Correct 77 ms 4832 KB Output is correct
16 Correct 104 ms 5364 KB Output is correct
17 Correct 62 ms 5984 KB Output is correct
18 Correct 280 ms 9436 KB Output is correct
19 Correct 239 ms 9692 KB Output is correct
20 Correct 537 ms 14804 KB Output is correct
21 Correct 550 ms 16980 KB Output is correct
22 Correct 675 ms 21972 KB Output is correct
23 Correct 698 ms 21844 KB Output is correct
24 Correct 395 ms 13780 KB Output is correct
25 Correct 323 ms 15060 KB Output is correct