제출 #521910

#제출 시각아이디문제언어결과실행 시간메모리
521910jjang36524Aliens (IOI16_aliens)C++14
100 / 100
131 ms12048 KiB
#include <iostream> #include <vector> #include <string.h> #include <algorithm> #define int long long using namespace std; int x[1000100]; int y[1000100]; int dp[1000100]; int cnt[1010100]; vector<pair<pair<int, int>, pair<int, int>>>s; int N; pair<int, int> getv(int c) { s.clear(); int nowpos = 0; int i; for (i = 0; i < N; i++) { int sp = -2 * x[i]; int yp = (i ? dp[i - 1] : 0) + x[i] * x[i] - (i ? (max(0LL, y[i - 1] - x[i] + 1) * (max(0LL, y[i - 1] - x[i] + 1))) : 0); int p = 0; while (s.size()) { p = (yp - s.back().first.second) / (s.back().first.first - sp); if (s.back().second.first < p) break; if (nowpos == s.size()) nowpos--; s.pop_back(); } s.push_back({ {-2 * x[i],(i ? dp[i - 1] : 0) + x[i] * x[i] - (i ? (max(0LL,y[i - 1] - x[i] + 1) * (max(0LL,y[i - 1] - x[i] + 1))) : 0)},{p,(i?cnt[i - 1]:0)} }); while (nowpos < s.size() - 1 && s[nowpos + 1].second.first < y[i] + 1) nowpos++; dp[i] = s[nowpos].first.first * (y[i] + 1) + s[nowpos].first.second + (y[i] + 1) * (y[i] + 1) + c; cnt[i] = s[nowpos].second.second + 1; } return { cnt[N - 1],dp[N - 1] }; } long long take_photos(signed n, signed m, signed k, std::vector<signed> r, std::vector<signed> c) { vector<pair<int, int>>so; int i; for (i = 0; i < n; i++) { so.push_back({ min(r[i],c[i]),max(r[i],c[i]) }); } sort(so.begin(), so.end()); int si = 0; for (i = 0; i < n; i++) { if (si>0&&x[si - 1] == so[i].first) { x[si - 1] = so[i].first; y[si - 1] = so[i].second; } else if (si == 0 || y[si - 1] < so[i].second) { x[si] = so[i].first; y[si] = so[i].second; si++; } } N = si; k = min(k, (signed)N); int s = 0, e = 1LL << 40; pair<int, int>rv = { 1LL << 40,0 }; pair<int, int>lv = { 0,0 }; while (s <= e) { int m = (s + e) / 2; auto v = getv(m); if (v.first == k) { return v.second - k * m; } else if (v.first < k) { e = m - 1; lv = max(lv, make_pair(v.first, v.second - v.first * m)); } else { s = m + 1; rv = min(rv, make_pair(v.first, v.second - v.first * m)); } } return rv.second + (lv.second - rv.second) / (rv.first - lv.first) * (rv.first - k); }

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

aliens.cpp: In function 'std::pair<long long int, long long int> getv(long long int)':
aliens.cpp:28:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |    if (nowpos == s.size())
      |        ~~~~~~~^~~~~~~~~~~
aliens.cpp:33:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |   while (nowpos < s.size() - 1 && s[nowpos + 1].second.first < y[i] + 1)
      |          ~~~~~~~^~~~~~~~~~~~~~
#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...