Submission #1308816

#TimeUsernameProblemLanguageResultExecution timeMemory
1308816RaresAliens (IOI16_aliens)C++20
25 / 100
2 ms352 KiB
///acum n*log (maxval) cu aliens trick+cht trick #include <bits/stdc++.h> #include "aliens.h" using namespace std; /**ifstream fin ("date.in"); ofstream fout ("date.out"); #define cin fin #define cout fout**/ const int MAXN=1e5+10; typedef long long ll; ll INF=1e15; ll n,m,k; __int128 dp[MAXN]; int cnt[MAXN]; pair <__int128,__int128> d[MAXN]; vector <pair <int,int>> aux,v; bool cmp (pair <ll,ll> a, pair <ll,ll> b){ if (a.first==b.first) return a.second>b.second; return a.first<b.first; } __int128 f (pair <__int128,__int128> d, __int128 x){ return d.first*x+d.second; } bool g (ll i, ll j, __int128 x){ ///daca j <= i atunci scot i if (f (d[i],x)>f (d[j],x)) return true; if (f (d[i],x)<f (d[j],x)) return false; return cnt[i]>=cnt[j]; } ll solve (__int128 x){ dp[0]=cnt[0]=0; for (int i=1;i<=n;++i){ dp[i]=INF; cnt[i]=1e9; } deque <int> dq; for (int i=0;i<=n;++i){ if (i){ dp[i]=v[i].second*v[i].second; if (dq.empty ()){ cnt[i]=1; } else{ while (dq.size ()>=2){ int i1=dq.front (); dq.pop_front (); int i2=dq.front (); dq.push_front (i1); if (g (i1,i2,v[i].second)){ dq.pop_front (); } else break; } int pcrt=dq.front (); dp[i]+=f (d[pcrt],v[i].second); cnt[i]=cnt[pcrt]+1; } } if (i<=n-1){ ll acrt=-2*(v[i+1].first-1); __int128 bcrt=dp[i]+1LL*(v[i+1].first-1)*(v[i+1].first-1)+x; __int128 aux=max (0,v[i].second-v[i+1].first+1); aux*=aux; bcrt-=aux; bcrt=min (bcrt,__int128(INF)); d[i]={acrt,bcrt}; while (dq.size ()>=2){ int i1=dq.back (); dq.pop_back (); int i2=dq.back (); /** x1=(d[i2].second-d[i1].second)/(d[i1].first-d[i2].first) x2=(d[i2].second-d[i].second)/(d[i].first-d[i2].first) **/ __int128 a=__int128(d[i2].second-d[i1].second)*__int128 (d[i].first-d[i2].first); __int128 b=__int128(d[i1].first-d[i2].first)*__int128 (d[i2].second-d[i].second); if (a>b or (a==b and cnt[i]>=cnt[i1])){ continue; } dq.push_back (i1); break; } dq.push_back (i); } } return cnt[n]; } ll take_photos (int N, int M, int K, vector <int> r, vector <int> c){ n=N; m=M; k=K; for (int i=0;i<n;++i){ r[i]++; c[i]++; if (r[i]>c[i]){ swap (r[i],c[i]); } aux.push_back ({r[i],c[i]}); } sort (aux.begin (),aux.end (),cmp); v.push_back ({0,0}); int cmax=0; for (auto x:aux){ if (x.second>cmax){ cmax=x.second; v.push_back (x); } } n=v.size ()-1; ll st=0,dr=1e12,rez; while (st<=dr){ ll mij=(st+dr)/2; if (solve (mij)>k){ st=mij+1; } else{ dr=mij-1; rez=mij; } } solve (rez); return dp[n]-__int128 (k)*rez; }

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...