제출 #233412

#제출 시각아이디문제언어결과실행 시간메모리
233412nicolaalexandraThe Kingdom of JOIOI (JOI17_joioi)C++14
60 / 100
4090 ms197292 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...