Submission #390706

#TimeUsernameProblemLanguageResultExecution timeMemory
390706ponytailAliens (IOI16_aliens)C++17
25 / 100
54 ms16204 KiB
#include "bits/stdc++.h" #define int long long #define fi first #define se second #define pb push_back using namespace std; const int BIG = 1e18; const int is_query = -BIG; struct line { int m, b; mutable function<const line*()> succ; bool operator<(const line& rhs) const { if (rhs.b != is_query) return m < rhs.m; const line* s = succ(); if (!s) return 0; int x = rhs.m; return b - s->b < (s->m - m) * x; } }; struct dynamic_hull : public multiset<line> { const int inf = BIG; bool bad(iterator y) { auto z = next(y); if (y == begin()) { if (z == end()) return 0; return y->m == z->m && y->b <= z->b; } auto x = prev(y); if (z == end()) return y->m == x->m && y->b <= x->b; int v1 = (x->b - y->b); if (y->m == x->m) v1 = x->b > y->b ? inf : -inf; else v1 /= (y->m - x->m); int v2 = (y->b - z->b); if (z->m == y->m) v2 = y->b > z->b ? inf : -inf; else v2 /= (z->m - y->m); return v1 >= v2; } void insert_line(int m, int b) { auto y = insert({m,b}); y->succ = [=] { return next(y) == end() ? 0 : &*next(y); }; if (bad(y)) { erase(y); return; } while (next(y) != end() && bad(next(y))) erase(next(y)); while (y != begin() && bad(prev(y))) erase(prev(y)); } int eval(int x) { auto l = *lower_bound((line) { x, is_query }); return l.m * x + l.b; } }; int N,M,K; int take_photos(signed N, signed M,signed K,vector<signed>r, vector<signed>c){ map<pair<int,int>,int>iexist; int MAX[M]; for(int i=0;i<M;i++) MAX[i]=-1; for(int i=0;i<N;i++){ if(r[i]>c[i]){ swap(r[i],c[i]); } iexist[{r[i],c[i]}]=1; MAX[r[i]]=max(MAX[r[i]],(int)c[i]); } int prefMAX[M]; prefMAX[0]=MAX[0]; for(int i=1;i<M;i++){ prefMAX[i]=max(prefMAX[i-1], MAX[i]); } map<pair<int,int>,int>idontexist; for(pair<pair<int,int>,int> x:iexist){ if(x.fi.fi>0 && prefMAX[x.fi.fi-1]>=x.fi.se) continue; if(MAX[x.fi.fi]>x.fi.se) continue; idontexist[x.fi]=1; } iexist.clear(); for(pair<pair<int,int>,int> x:idontexist){ iexist[x.fi]=1; } N=iexist.size(); int pointer=0; for(pair<pair<int,int>,int> x:iexist){ r[pointer]=x.fi.fi; c[pointer]=x.fi.se; pointer++; } K=min(K,N); int dp[K+1][N]; for(int i=0;i<N;i++){ dp[1][i]=(c[i]-r[0]+1)*(c[i]-r[0]+1); } for(int i=2;i<=K;i++){ for(int j=i-1;j<N;j++){ dp[i][j]=1e14; for(int k=i-2;k<j;k++){ int area=(c[j]-r[k+1]+1)*(c[j]-r[k+1]+1); if(c[k]>=r[k+1]){ area-=(c[k]-r[k+1]+1)*(c[k]-r[k+1]+1); } dp[i][j]=min(dp[i][j],dp[i-1][k]+area); } } } int ans=1e18; for(int i=1;i<=K;i++) ans=min(ans, dp[i][N-1]); return ans; }
#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...