제출 #29435

#제출 시각아이디문제언어결과실행 시간메모리
29435PrOAhMeTThe Kingdom of JOIOI (JOI17_joioi)C++14
60 / 100
4000 ms151304 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define LL long long
#define st first
#define nd second
#define endl '\n'
using namespace std;

const int MAXN=2005;
int a[MAXN][MAXN],n,m,ans=1e9,mx,mn,idx,l,r,add,mnn,b[MAXN][MAXN];
multiset<int> mpp;

void rotate1() {

	//cout<<"fuk"<<endl;
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j) {
			b[i][m-j-1]=a[i][j];
		}
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j) {
			a[i][j]=b[i][j];
		}

}

void rotate2() {

	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j) {
			b[n-i-1][j]=a[i][j];
		}
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j) {
			a[i][j]=b[i][j];
		}

}

int solve() {

	/*for(int i=0;i<n;++i) {
		for(int j=0;j<m;++j) {
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}*/
	int ret=1e9;
	int x,y;
	mn=1e9+1;
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j) {
			mpp.insert(a[i][j]);
			if(mn>a[i][j]) {
				mn=a[i][j];
				x=i;
				y=j;
			}
		}
	//cout<<"xd"<<endl;
	mx=0;
	//cout<<x<<" "<<y<<" "<<mpp.size()<<endl;
	int up[MAXN];
	int cnt=0;
	memset(up,0,sizeof up);
	for(int j=0;j<=x;++j) {
		up[j]=y+1;
		for(int i=0;i<=y;++i)  {
				mx=max(mx,a[j][i]);
				mpp.erase(mpp.find(a[j][i]));
				++cnt;
		}
	}
	if(mpp.size()) ret=min(ret,max(mx-mn,*(--mpp.end())-*mpp.begin()));
	priority_queue<pii> pq;
	for(int i=0;i<n;++i) {
		if(up[i]!=m) {
			if(i&&up[i]==up[i-1])
				continue;
			pq.push(mp(-a[i][up[i]],i));
		}
	}
	//cout<<"xd"<<endl;
	pii dd;
	int val;
	while(!mpp.empty()) {
		//cout<<pq.size()<<" "<<up[1]<<endl;
		add=-1,mnn=1e9+1;
		dd=pq.top();
		pq.pop();
		add=dd.nd;
		val=-dd.st;
		mx=max(mx,val);
		mpp.erase(mpp.find(val));
		++up[add];
		//cout<<add<<" "<<up[add]<<" "<<up[1]<<endl;
		if(up[add]!=m) {
			if(add!=0&&up[add]==up[add-1]);
			else pq.push(mp(-a[add][up[add]],add));
		}
		//cout<<up[add+1]<<" "<<add+1<<" "<<up[1]<<endl;
		if(add+1!=n&&up[add+1]==up[add]-1)
			pq.push(mp(-a[add+1][up[add+1]],add+1));
		//cout<<mpp.size()<<endl;
		if(!mpp.empty()) ret=min(ret,max(mx-mn,*(--mpp.end())-*mpp.begin()));
		//cout<<mpp.size()<<endl;	
	}
	//cout<<"rekt"<<endl;
	return ret;

}

int main() {

	scanf("%d %d",&n,&m);
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j) {
			scanf("%d",&a[i][j]);
		}
	ans=min(ans,solve());
	rotate1();
	//cout<<"malahmet"<<endl;
	ans=min(ans,solve());
	rotate2();
	ans=min(ans,solve());
	rotate1();
	ans=min(ans,solve());
	printf("%d\n",ans);

}

컴파일 시 표준 에러 (stderr) 메시지

joioi.cpp: In function 'int main()':
joioi.cpp:117:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&m);
                      ^
joioi.cpp:120:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d",&a[i][j]);
                        ^
joioi.cpp: In function 'int solve()':
joioi.cpp:70:16: warning: 'y' may be used uninitialized in this function [-Wmaybe-uninitialized]
   for(int i=0;i<=y;++i)  {
                ^
joioi.cpp:68:15: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
  for(int j=0;j<=x;++j) {
               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...