제출 #1018069

#제출 시각아이디문제언어결과실행 시간메모리
10180690npataAliens (IOI16_aliens)C++17
60 / 100
1000 ms1048576 KiB
#include "aliens.h" #include<bits/stdc++.h> using namespace std; #define vec vector #define int long long const int INF = 1e18; int eval(pair<int, int> f, int x) { return f.first * x + f.second; } // returns true iff f(intersect(g, h)) < g(intersect(g, h)) bool comp_mid(pair<int, int> f, pair<int, int> g, pair<int, int> h) { auto [a1, b1] = f; auto [a2, b2] = g; auto [a3, b3] = h; return (a1-a2)*(b3-b2) < (a3 - a2)*(b1-b2); } int take_photos(int32_t n, int32_t m, int32_t k, std::vector<int32_t> r, std::vector<int32_t> c) { vec<pair<int, int>> init_rang(n); for(int i = 0; i<n; i++) { init_rang[i].first = min(r[i], c[i]); init_rang[i].second = max(r[i], c[i]); } sort(init_rang.begin(), init_rang.end()); vec<pair<int, int>> rang{init_rang[0]}; for(int i = 1; i<n; i++) { if(init_rang[i].second <= rang.back().second) continue; if(init_rang[i].first == rang.back().first) { rang.back().second = init_rang[i].second; } else { rang.push_back(init_rang[i]); } } n = rang.size(); vec<vec<int>> dp(n+1, vec<int>(k+1, INF)); for(int i = 0; i<=k; i++) dp[n][i] = 0; vec<deque<pair<int, int>>> cts(k+1); for(int i = 0; i<n; i++) { rang[i].second++; } // calls to here should have parameter x decreasing for any given i auto query = [&](int i, int x) { while(cts[i].size() >= 2 && eval(cts[i][cts[i].size()-2], x) < eval(cts[i].back(), x)) { cts[i].pop_back(); } return eval(cts[i].back(), x); }; // calls to here should have parameter a increasing for any given i auto insert = [&](int i, int a, int b) { while(cts[i].size() >= 2 && comp_mid({a, b}, cts[i][0], cts[i][1])) cts[i].pop_front(); cts[i].push_front({a, b}); }; for(int i = n-1; i>=0; i--) { for(int j = 1; j<=k; j++) { // insert a line a = -2r[i] b = r[i]**2 + dp[i+1][j-1] insert(j, -2*rang[i].second, pow(rang[i].second, 2) + dp[i+1][j-1]); } for(int j = 1; j<=k; j++) { int mn = query(j, rang[i].first); // minimum value at position l[i] of lines in ct[j] dp[i][j] = (i>0 & (rang[i-1].second > rang[i].first) ? (-pow(rang[i-1].second - rang[i].first, 2)) : 0) + pow(rang[i].first, 2) + mn; } } int ans = INF; for(int i = 0; i<=k; i++) { ans = min(ans, dp[0][i]); } return ans; }

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

aliens.cpp: In function 'long long int take_photos(int32_t, int32_t, int32_t, std::vector<int>, std::vector<int>)':
aliens.cpp:76:17: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
   76 |    dp[i][j] = (i>0 & (rang[i-1].second > rang[i].first) ? (-pow(rang[i-1].second - rang[i].first, 2)) : 0) + pow(rang[i].first, 2) + mn;
      |                ~^~
#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...