///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=1e11,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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |