Submission #519579

#TimeUsernameProblemLanguageResultExecution timeMemory
519579AdamGSAliens (IOI16_aliens)C++17
100 / 100
1232 ms57100 KiB
#include "aliens.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<long long,long long> pt;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=1e5+7, MAXM=1e6+7;
const ll INF=1e18+7;
pt T[LIM];
pair<pt,int>tr[4*MAXM];
ll dp[LIM], lst[LIM], n, m, k, N=2;
ll f(pt a, ll x) {
	return a.st*x+a.nd;
}
void upd(pt x, int ind) {
	int v=1, l=0, r=N-1;
	while(true) {
		int mid=(l+r)/2;
		bool a=f(x, l)<f(tr[v].st, l);
		bool b=f(x, mid)<f(tr[v].st, mid);
		if(b) {
			swap(tr[v].st, x);
			swap(tr[v].nd, ind);
		}
		if(l==r) return;
		v*=2;
		if(a!=b) r=mid;
		else {
			++v;
			l=mid+1;
		}
	}
}
pair<ll,int>cnt(ll x) {
	int v=x+N;
	pair<ll,int>ans={INF, 0};
	while(v) {
		ans=min(ans, {f(tr[v].st, x), tr[v].nd});
		v/=2;
	}
	return ans;
}
int solve(ll c) {
	rep(i, 2*N) tr[i]={{0, INF}, MAXM};
	upd({-2*T[0].st, T[0].st*T[0].st-2*T[0].st}, -1);
	rep(i, n) {
		pair<ll,int>p=cnt(T[i].nd);
		dp[i]=p.st+T[i].nd*T[i].nd+2*T[i].nd+1+c;
		lst[i]=p.nd;
		if(i<n-1) {
			ll b=max(T[i].nd-T[i+1].st+1, 0ll);
			b*=-b;
			b+=dp[i]+T[i+1].st*T[i+1].st-2*T[i+1].st;
			upd({-2*T[i+1].st, b}, i);
		}
	}
	int akt=n-1, ans=0;
	while(akt>=0) {
		++ans;
		akt=lst[akt];
	}
	return ans;
}
ll take_photos(int Z, int M, int K, vector<int>r, vector<int>c) {
	pair<ll,ll>P[Z];
	rep(i, Z) P[i]={min(r[i], c[i]), -max(r[i], c[i])};
	sort(P, P+Z);
	ll ma=-1;
	rep(i, Z) {
		if(-P[i].nd>ma) {
			ma=-P[i].nd;
			T[n]={P[i].st, -P[i].nd};
			++n;
		}
	}
	m=M; k=K;
	while(N<m) N*=2;
	ll po=0, ko=10000000000000;
	while(po<ko) {
		ll sr=(po+ko)/2;
		if(solve(sr)>k) po=sr+1; else ko=sr;
	}
	solve(po);
	return dp[n-1]-po*k;
}
#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...