이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define DIM 2010
#define DIMBUFF 30000000
#define INF 2000000000
using namespace std;
int a[DIM][DIM],b[DIM][DIM],viz[DIM][DIM];
struct idk{
int val,l,c;
} v[DIM*DIM];
pair<int,int> c[DIM*DIM];
int di[] = {-1,1,0,0};
int dj[] = {0,0,-1,1};
int n,m,i,j,sol,mini,maxi,k,pos;
char buff[DIMBUFF];
multiset <int> s;
void solve (){
/// toate valorile < maxi - val trb puse in zona minimelor
memset (viz,0,sizeof viz);
int minim = INF, maxim = 0;
for (int i=1;i<=k;++i){
int lin = v[i].l, col = v[i].c;
if (viz[lin][col])
continue;
int p = 1, u = 1;
c[1] = make_pair(lin,col);
viz[lin][col] = 1;
s.erase (s.find(a[lin][col]));
minim = min (minim,a[lin][col]);
maxim = max (maxim,a[lin][col]);
while (p <= u){
int ic = c[p].first;
int jc = c[p].second;
p++;
for (int dir=0;dir<=3;++dir){
int iv = ic + di[dir];
int jv = jc + dj[dir];
if (iv >= lin && iv <= n && jv >= 1 && jv <= col && !viz[iv][jv]){
viz[iv][jv] = 1;
c[++u] = make_pair(iv,jv);
s.erase (s.find(a[iv][jv]));
minim = min (minim,a[iv][jv]);
maxim = max (maxim,a[iv][jv]);
}}}
if (s.empty())
break;
int val = maxim - minim;
val = max (val, (*s.rbegin()) - (*s.begin()));
/*cout<<val<<" "<<lin<<" "<<col<<" "<<(*s.rbegin()) - (*s.begin())<<"\n";
for (auto it : s)
cout<<it<<" ";
cout<<endl;
*/
sol = min (sol,val);
}
}
inline int cmp (idk a, idk b){
return a.val < b.val;
}
void roteste(){
int idx = 0;
s.clear();
for (i=1;i<=n;++i)
for (j=1;j<=m;++j){
b[m-j+1][i] = a[i][j];
idx++;
int l = v[idx].l, c = v[idx].c;
v[idx].l = m-c+1;
v[idx].c = l;
s.insert(a[i][j]);
}
swap (n,m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
a[i][j] = b[i][j];
}
int get_nr(){
while (!(buff[pos] >= '0' && buff[pos] <= '9'))
++pos;
int nr = 0;
while (buff[pos] >= '0' && buff[pos] <= '9'){
nr = nr*10 + buff[pos] - '0';
++pos;
}
return nr;
}
int main (){
//FILE *fin = fopen ("date.in","r");
//FILE *fout = fopen ("date.out","w");
FILE *fin = stdin;
FILE *fout = stdout;
fread (buff,1,DIMBUFF,fin);
//cin>>n>>m;
n = get_nr(), m = get_nr();
mini = INF;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j){
//cin>>a[i][j];
a[i][j] = get_nr();
mini = min (mini,a[i][j]);
maxi = max (maxi,a[i][j]);
v[++k] = {a[i][j],i,j};
s.insert(a[i][j]);
}
sort (v+1,v+k+1,cmp);
sol = INF;
solve();
roteste();
solve();
roteste();
solve();
roteste();
solve();
fprintf(fout,"%d",sol);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
joioi.cpp: In function 'int main()':
joioi.cpp:108:11: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
fread (buff,1,DIMBUFF,fin);
~~~~~~^~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |