Submission #361509

#TimeUsernameProblemLanguageResultExecution timeMemory
361509ryangohcaAliens (IOI16_aliens)C++17
100 / 100
394 ms9180 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; #define pii pair<long long, long long> vector<pii> points; vector<pii> impt; pii dp[100001]; deque<pair<pii, int>> dq; long long f(pii line, long long x){ return line.first*x + line.second; } pii query(long long x){ while(dq.size()>1){ //to prevent seg fault when accessing dq[1] long long fa = f(dq[0].first, x), fb = f(dq[1].first, x); if (fa == fb){ if (dq[0].second > dq[1].second) dq.pop_front(); else break; } else if(fa > fb) //the next line is better dq.pop_front(); //remove useless line else break; } return pii(f(dq[0].first,x), dq[0].second); } double intersect(long long m1, long long c1, long long m2, long long c2){ return (double)(c2-c1)/(m1-m2); } double intersect(pii p1, pii p2){ return intersect(p1.first,p1.second,p2.first,p2.second); } void insert(long long m,long long c, long long x) {//insert line y=mx+c pii line = make_pair(m,c); while (dq.size()>1) { //to prevent seg fault int s = dq.size(); double a = intersect(dq[s-1].first, line), b = intersect(dq[s-2].first, line); if (a <= b) dq.pop_back(); //removes useless line else break; } dq.push_back({line, x}); } long long sq(long long x){ return x*x; } pii check(long long c){ dq.clear(); dp[0] = {0, 0}; for (int i = 1; i < impt.size(); i++){ dp[i] = {sq(impt[i].second - impt[1].first + 1) + c, 1}; if (i != 1) { insert(-2 * impt[i].first, sq(impt[i].first) - 2 * (impt[i].first) + dp[i-1].first - sq(max(0ll, impt[i-1].second - impt[i].first + 1)), dp[i-1].second); pii g = query(impt[i].second); g.first += sq(impt[i].second) + 2 * impt[i].second + c + 1; g.second++; dp[i] = min(dp[i], g); } /* for (int j = 2; j <= i; j++){ dp[i] = min(dp[i], {dp[j-1].first + c + sq(impt[i].second - impt[j].first + 1) - sq(max(0ll, impt[j-1].second - impt[j].first + 1)), dp[j-1].second + 1}); } */ } return dp[impt.size()-1]; } // sq(impt[i].second - impt[j].first + 1) // = dp[j-1].first + c + -2 * (impt[i].second) * (impt[j].first) + impt[i].second ^ 2 + 2 * impt[i].second + impt[j].first ^ 2 - 2 * (impt[j].first) + 1 // = [-2 * (impt[i].second) * (impt[j].first) + impt[j].first ^ 2 - 2 * (impt[j].first) + dp[j-1].first] + impt[i].second ^ 2 + 2 * impt[i].second + c + 1 long long take_photos(int N, int m, int K, std::vector<int> R, std::vector<int> C) { for (int i = 0; i < N; i++) { int r = R[i], c = C[i]; if (r > c) swap(r, c); points.push_back({r, c}); } impt.push_back({-1, -1}); // dummy sort(points.begin(), points.end()); for (auto [a, b] : points){ if (impt.empty() || impt.back().second < b) impt.push_back({a, b}); } //K = min(K, (int)impt.size()-1); long long mini = -1, maxi = 1e16; while (maxi - mini > 1){ long long mid = (maxi + mini) /2; if (check(mid).second <= K) maxi = mid; else mini = mid; } return check(maxi).first - K * maxi; }

Compilation message (stderr)

aliens.cpp: In function 'std::pair<long long int, long long int> check(long long int)':
aliens.cpp:46:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |     for (int i = 1; i < impt.size(); i++){
      |                     ~~^~~~~~~~~~~~~
#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...