답안 #142957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
142957 2019-08-12T11:08:56 Z arnold518 The Kingdom of JOIOI (JOI17_joioi) C++14
0 / 100
2 ms 504 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 2000;

int H, W, A[MAXN+10][MAXN+10], maxval=-987654321, minval=987654321;
int B[MAXN+10][MAXN+10], l[MAXN+10][3], r[MAXN+10][3];

bool decide(int K)
{
	int i, j;
	if(maxval-minval<=K) return true;

	int a=-1;
	for(i=1; i<=H; i++)
	{
		l[i][1]=l[i][2]=987654321; r[i][1]=r[i][2]=-1;
		for(j=1; j<=W; j++)
		{
			if(minval<=A[i][j] && A[i][j]<maxval-K) B[i][j]=1;
			else if(minval+K<A[i][j] && A[i][j]<=maxval) B[i][j]=2;
			else B[i][j]=0;

			r[i][B[i][j]]=max(r[i][B[i][j]], j);
			l[i][B[i][j]]=min(l[i][B[i][j]], j);
		}
	}
	bool flag; int now;

	flag=true; now=0;
	for(i=1; i<=H; i++)
	{
		if(r[i][1]==-1 && r[i][2]==-1) continue;
		int s, e;
		if(r[i][1]!=-1 && r[i][2]!=-1) s=r[i][1], e=l[i][2]-1;
		else if(r[i][2]==-1) s=r[i][1], e=W;
		else if(r[i][1]==-1) s=0, e=l[i][2]-1;
		if(s>e) flag=false;
		if(e<now) flag=false;
		if(now<s) now=s;
	}
	if(flag) return true;

	flag=true; now=0;
	for(i=1; i<=H; i++)
	{
		if(r[i][1]==-1 && r[i][2]==-1) continue;
		int s, e;
		if(r[i][1]!=-1 && r[i][2]!=-1) s=r[i][2], e=l[i][1]-1;
		else if(r[i][1]==-1) s=r[i][2], e=W;
		else if(r[i][2]==-1) s=0, e=l[i][1]-1;
		if(s>e) flag=false;
		if(e<now) flag=false;
		if(now<s) now=s;
	}
	if(flag) return true;


	flag=true; now=0;
	for(i=H; i>=1; i--)
	{
		if(r[i][1]==-1 && r[i][2]==-1) continue;
		int s, e;
		if(r[i][1]!=-1 && r[i][2]!=-1) s=r[i][1], e=l[i][2]-1;
		else if(r[i][2]==-1) s=r[i][1], e=W;
		else if(r[i][1]==-1) s=0, e=l[i][2]-1;
		if(s>e) flag=false;
		if(e<now) flag=false;
		if(now<s) now=s;
	}
	if(flag) return true;

	flag=true; now=0;
	for(i=H; i>=1; i--)
	{
		if(r[i][1]==-1 && r[i][2]==-1) continue;
		int s, e;
		if(r[i][1]!=-1 && r[i][2]!=-1) s=r[i][2], e=l[i][1]-1;
		else if(r[i][1]==-1) s=r[i][2], e=W;
		else if(r[i][2]==-1) s=0, e=l[i][1]-1;
		if(s>e) flag=false;
		if(e<now) flag=false;
		if(now<s) now=s;
	}
	if(flag) return true;
	return false;
}

int main()
{
	int i, j;
	
	scanf("%d%d", &H, &W);
	for(i=1; i<=H; i++) for(j=1; j<=W; j++)
	{
		scanf("%d", &A[i][j]);
		maxval=max(maxval, A[i][j]);
		minval=min(minval, A[i][j]);
	}

	int lo=0, hi=1e9;
	while(lo+1<hi)
	{
		int mid=lo+hi>>1;
		if(decide(mid)) hi=mid;
		else lo=mid;
	}
	printf("%d", hi);
}

Compilation message

joioi.cpp: In function 'bool decide(int)':
joioi.cpp:18:6: warning: unused variable 'a' [-Wunused-variable]
  int a=-1;
      ^
joioi.cpp: In function 'int main()':
joioi.cpp:108:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int mid=lo+hi>>1;
           ~~^~~
joioi.cpp:97:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &H, &W);
  ~~~~~^~~~~~~~~~~~~~~~
joioi.cpp:100:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &A[i][j]);
   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Incorrect 2 ms 376 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Incorrect 2 ms 376 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Incorrect 2 ms 376 KB Output isn't correct
5 Halted 0 ms 0 KB -