제출 #481370

#제출 시각아이디문제언어결과실행 시간메모리
481370LoboThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
1327 ms25684 KiB
#include <bits/stdc++.h> using namespace std; const long long INFll = (long long) 1e18 + 10; const int INFii = (int) 1e9 + 10; typedef long long ll; typedef int ii; typedef long double dbl; #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() #define maxn 2002 ii n, m, a[maxn][maxn]; pair<ii,ii> p[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); //freopen("in.in", "r", stdin); //freopen("out.out", "w", stdout); cin >> n >> m; ii mn = INFii; ii mx = 0; for(ii i = 1; i <= n; i++) { for(ii j = 1; j <= m; j++) { cin >> a[i][j]; mn = min(mn,a[i][j]); mx = max(mx,a[i][j]); } } if(mn == mx) { cout << 0 << endl; return 0; } // com minimo na esquerda: ii l = 0; ii r = 1e9+1; ii ans1; while(l <= r) { ii mid = (l+r)/2; for(ii i = 1; i <= n; i++) { p[i].fr = 0; p[i].sc = m+1; } for(ii i = 1; i <= n; i++) { for(ii j = 1; j <= m; j++) { if(abs(a[i][j]-mn) > mid) { p[i].sc = min(p[i].sc,j-1); } if(abs(a[i][j]-mx) > mid) { p[i].fr = max(p[i].fr,j); } } } //ver se ta crescente/decrescente ii actc = 0; bool okc = 1; ii actd = m+1; bool okd = 1; for(ii i = 1; i <= n; i++) { actc = max(actc,p[i].fr); if(actc > p[i].sc || p[i].fr > p[i].sc) okc = 0; actd = min(actd,p[i].sc); if(actd < p[i].fr || p[i].fr > p[i].sc) okd = 0; } if(okc || okd) { //se deu bom com esse (l+r)/2 quero abaixar o (l+r)/2 ans1 = mid; r = mid-1; } else { l = mid+1; } } //com mx na esquerda l = 0; r = 1e9+1; ii ans2; while(l <= r) { ii mid = (l+r)/2; for(ii i = 1; i <= n; i++) { p[i].fr = 0; p[i].sc = m+1; } for(ii i = 1; i <= n; i++) { for(ii j = 1; j <= m; j++) { if(abs(a[i][j]-mn) > mid) { p[i].fr = max(p[i].fr,j); } if(abs(a[i][j]-mx) > mid) { p[i].sc = min(p[i].sc,j-1); } } } //ver se ta crescente/decrescente ii actc = 0; bool okc = 1; ii actd = m+1; bool okd = 1; for(ii i = 1; i <= n; i++) { actc = max(actc,p[i].fr); if(actc > p[i].sc || p[i].fr > p[i].sc) okc = 0; actd = min(actd,p[i].sc); if(actd < p[i].fr || p[i].fr > p[i].sc) okd = 0; } if(okc || okd) { //se deu bom com esse (l+r)/2 quero abaixar o (l+r)/2 ans2 = mid; r = mid-1; } else { l = mid+1; } } cout << min(ans1,ans2) << endl; }

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

joioi.cpp: In function 'int main()':
joioi.cpp:98:8: warning: 'ans2' may be used uninitialized in this function [-Wmaybe-uninitialized]
   98 |     ii ans2;
      |        ^~~~
joioi.cpp:50:8: warning: 'ans1' may be used uninitialized in this function [-Wmaybe-uninitialized]
   50 |     ii ans1;
      |        ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...