제출 #290707

#제출 시각아이디문제언어결과실행 시간메모리
290707SamAndAliens (IOI16_aliens)C++17
41 / 100
2081 ms63224 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; #define m_p make_pair #define fi first #define se second #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) typedef long long ll; const int N = 100005; const ll INF = 1000000009000000009; struct ban { int l, r; }; bool operator<(const ban& a, const ban& b) { return a.r < b.r; } int n, m, k; ban a[N]; int hat(pair<int, int> a, pair<int, int> b) { return max(0, min(a.se, b.se) - max(a.fi, b.fi) + 1); } ll** dp; void rec(int i, int l, int r, int ul, int ur) { if (l > r) return; int m = (l + r) / 2; dp[i][m] = INF; int mini; for (int u = ur; u >= ul; --u) { ll yans; if (u == 1) yans = (a[i].r - a[u].l + 1) * 1LL * (a[i].r - a[u].l + 1); else yans = dp[u - 1][m - 1] + (a[i].r - a[u].l + 1) * 1LL * (a[i].r - a[u].l + 1) - hat(m_p(a[u].l, a[i].r), m_p(a[u - 1].l, a[u - 1].r)) * 1LL * hat(m_p(a[u].l, a[i].r), m_p(a[u - 1].l, a[u - 1].r)); if (yans < dp[i][m]) { dp[i][m] = yans; mini = u; } } rec(i, l, m - 1, ul, mini); rec(i, m + 1, r, mini, ur); } ll solv3() { sort(a + 1, a + n + 1); dp = new ll*[n + 5]; for (int i = 0; i < n + 5; ++i) dp[i] = new ll[k + 5]; for (int i = 1; i <= n; ++i) { dp[i][0] = INF; rec(i, 1, k, 1, i); /*for (int j = 1; j <= k; ++j) { dp[i][j] = m * m; for (int u = i; u >= 1; --u) { if (u == 1) { dp[i][j] = min(dp[i][j], (a[i].r - a[u].l + 1) * (a[i].r - a[u].l + 1)); continue; } dp[i][j] = min(dp[i][j], dp[u - 1][j - 1] + (a[i].r - a[u].l + 1) * (a[i].r - a[u].l + 1) - hat(m_p(a[u].l, a[i].r), m_p(a[u - 1].l, a[u - 1].r)) * hat(m_p(a[u].l, a[i].r), m_p(a[u - 1].l, a[u - 1].r))); } }*/ } return dp[n][k]; } long long take_photos(int n_, int m_, int k_, std::vector<int> r, std::vector<int> c) { n = n_; m = m_; k = k_; for (int i = 1; i <= n; ++i) { a[i].l = r[i - 1]; a[i].r = c[i - 1]; if (a[i].l > a[i].r) swap(a[i].l, a[i].r); ++a[i].l; ++a[i].r; } vector<ban> v; bool z[N] = {}; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (z[j]) continue; if (i == j) continue; if (a[j].l <= a[i].l && a[i].r <= a[j].r) { z[i] = true; break; } } if (!z[i]) v.push_back(a[i]); } n = sz(v); for (int i = 1; i <= n; ++i) a[i] = v[i - 1]; k = min(k, n); return solv3(); }

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

aliens.cpp: In function 'void rec(int, int, int, int, int)':
aliens.cpp:53:8: warning: 'mini' may be used uninitialized in this function [-Wmaybe-uninitialized]
   53 |     rec(i, l, m - 1, ul, mini);
      |     ~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...