# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
531292 | David_M | Aliens (IOI16_aliens) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
deque<pair<pll, int> > dq;
int o;
bool check (ll k, ll b){
auto [k0,b0]=dq[0].F;
auto [k1,b1]=dq[1].F;
return (b - b1) * (k1 - k0) - (b0 - b1) * (k1 - k) > 0;
}
void add(ll k, ll b, int cnt){
while(dq.size()>1 && check(k, b))dq.pop_front(),o=max(o-1,0);
dq.push_front({{k,b},cnt});
}
pii get(int i, ll x, ll C){
auto [k,b]=dq[i].F;
return {k*x+b, dq[i].S};
}
void calc_dp(int n, vector<pll> v, vector<pll> &dp, ll C){
dp[0]={0,0};
add(-2*v[0].F, v[0].F*v[0].F, 0);
for (int i=1; i<=n; i++){
auto &[ans, cnt]=dp[i];
ll r=v[i-1].S;
ans=r*r+C;
cnt=1;
ll x=r;
while(i>1 && get(o,x,C)>get(o+1,x,C))o++;
auto [ans0, cnt0]=get(o,x,C);
ans+=ans0;
cnt+=cnt0;
if(i==n)continue;
ll l=v[i].F;
add(l*-2, ans + l*l - max((ll)0, r-l)*max((ll)0, r-l), cnt);
}
}
ll take_photos(int n, ll m, ll k, vector<int> r, vector<int> c) {
ll Ans=0;
vector<pll> v, V(n);
for (int i=0; i<n; i++){
if(c[i]<r[i])swap(r[i], c[i]);
V[i]={r[i], -c[i]};
}
sort(all(V));
ll rr=-1;
for (auto [l,r]:V){
r*=-1;
if(r>rr)v.pb({l,r+1});
rr=max(r, rr);
}
V.clear();
n=v.size();
ll L=0, R=m*m;
while(L<=R){
ll C=L+R>>1;
vector<pll> dp(n+1);
calc_dp(n, v, dp, C);
if(dp[n].S>k){
L=C+1;
}else{
Ans=dp[n].F;
R=C-1;
}
dq.clear();
o=0;
}
return Ans-k*L;
}//#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
deque<pair<pll, int> > dq;
int o;
bool check (ll k, ll b){
auto [k0,b0]=dq[0].F;
auto [k1,b1]=dq[1].F;
return (b - b1) * (k1 - k0) - (b0 - b1) * (k1 - k) > 0;
}
void add(ll k, ll b, int cnt){
while(dq.size()>1 && check(k, b))dq.pop_front(),o=max(o-1,0);
dq.push_front({{k,b},cnt});
}
pii get(int i, ll x, ll C){
auto [k,b]=dq[i].F;
return {k*x+b, dq[i].S};
}
void calc_dp(int n, vector<pll> v, vector<pll> &dp, ll C){
dp[0]={0,0};
add(-2*v[0].F, v[0].F*v[0].F, 0);
for (int i=1; i<=n; i++){
auto &[ans, cnt]=dp[i];
ll r=v[i-1].S;
ans=r*r+C;
cnt=1;
ll x=r;
while(i>1 && get(o,x,C)>get(o+1,x,C))o++;
auto [ans0, cnt0]=get(o,x,C);
ans+=ans0;
cnt+=cnt0;
if(i==n)continue;
ll l=v[i].F;
add(l*-2, ans + l*l - max((ll)0, r-l)*max((ll)0, r-l), cnt);
}
}
ll take_photos(int n, ll m, ll k, vector<int> r, vector<int> c) {
ll Ans=0;
vector<pll> v, V(n);
for (int i=0; i<n; i++){
if(c[i]<r[i])swap(r[i], c[i]);
V[i]={r[i], -c[i]};
}
sort(all(V));
ll rr=-1;
for (auto [l,r]:V){
r*=-1;
if(r>rr)v.pb({l,r+1});
rr=max(r, rr);
}
V.clear();
n=v.size();
ll L=0, R=m*m;
while(L<=R){
ll C=L+R>>1;
vector<pll> dp(n+1);
calc_dp(n, v, dp, C);
if(dp[n].S>k){
L=C+1;
}else{
Ans=dp[n].F;
R=C-1;
}
dq.clear();
o=0;
}
return Ans-k*L;
}