Submission #30625

#TimeUsernameProblemLanguageResultExecution timeMemory
30625samir_droubiAliens (IOI16_aliens)C++14
60 / 100
606 ms136964 KiB
#include "aliens.h" #include <bits/stdc++.h> #define pii pair<int,int> #define ll long long using namespace std; bool cmp(pii x , pii y) { if(x.first == y.first)return x.second > y.second; return x.first < y.first; } struct CHT{ vector<ll>m; vector<ll>p; int it=0; bool check() { if(m.size() < 3)return false; int l1 = m.size() - 3; int l2 = m.size() - 2; int l3 = m.size() - 1; return 1LL*(p[l3] - p[l1]) * (m[l1] - m[l2]) < 1LL*(p[l2] - p[l1]) * (m[l1] - m[l3]); } void add(ll M,ll P) { m.push_back(M); p.push_back(P); while(check()) { m.erase(m.end() - 2); p.erase(p.end() - 2); } } ll calc(ll x,int i) { return x * m[i] + p[i]; } ll query(ll x) { if(it >= m.size() )it = m.size() - 1; while(it < m.size() - 1 && calc(x , it) >= calc(x , it + 1 ) ){ ++it; } return calc(x , it); } }ds[4005]; long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) { vector<pii>tmp; vector<pii>v; for(int i = 0 ; i < n ; ++i) tmp.push_back( { min( r[i], c[i] ) , max( r[i] , c[i] ) } ); sort( tmp.begin() , tmp.end() , cmp ); int last = -1; for(int i = 0 ; i < n ; ++i) { if(tmp[i].second <= last)continue; v.push_back( tmp[i] ); last = max(last , tmp[i].second); } ll ans = (1LL <<61); for(int i= 0 ; i <= k; ++i) ds[i].add(-2LL * (v[0].first - 1) , 1LL*(v[0].first - 1) * (v[0].first - 1) ); n = v.size(); for(int i = 0 ; i < n ; ++i) { ll l = v[i].first; ll r = v[i].second; for(int j = k ; j >= 1 ; --j) { ll dp = ds[j - 1].query(r) + 1LL*r * r; if(i == n - 1)ans = min(ans , dp); if(i < n - 1) { ll L = v[i + 1].first; ll mx = max(0LL , r - L + 1); ds[j].add( -2 * (L - 1) , (L - 1) * (L - 1) + dp - mx * mx ); } } } return ans; }

Compilation message (stderr)

aliens.cpp: In member function 'long long int CHT::query(long long int)':
aliens.cpp:39:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(it >= m.size() )it = m.size() - 1;
         ^
aliens.cpp:40:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(it < m.size() - 1 && calc(x , it) >= calc(x , it + 1 ) ){
            ^
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:69:9: warning: unused variable 'l' [-Wunused-variable]
      ll l = v[i].first;
         ^
#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...