제출 #732504

#제출 시각아이디문제언어결과실행 시간메모리
732504senthetaAliens (IOI16_aliens)C++17
25 / 100
66 ms456 KiB
#include "aliens.h"
// author : sentheta aka vanwij
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cassert>
#include<random>
#include<chrono>
#include<cmath>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;

#define Int long long
#define V vector
#define pii pair<int,int>
#define ff first
#define ss second

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

#define pow2(x) (1LL<<(x))
#define msb(x) (63-__builtin_clzll(x))
#define bitcnt(x) (__builtin_popcountll(x))

#define nl '\n'
#define _ << ' ' <<
#define all(x) (x).begin(), (x).end()
#define rep(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define dbg(x) if(1) cout << "?" << #x << " : " << (x) << endl << flush;
#define cerr if(1) cerr

const Int INF = 1e16;

// Max Lichao Tree
// To get minimum cht, set value of `MINCHT`
const Int L = -1e7-5;
const Int R = 1e7+5;
#define mid ((tl+tr)>>1)
struct Cht{
	static const bool MINCHT = 1;
	// evaluate y=p*x+q at x=b
	inline Int eval(pii a,Int b){return a.ff*b + a.ss; }
	V<pii> st={{0,-INF}};
	V<Int> lc={-1}, rc={-1};
	Int make(){
		st.push_back({0,-INF}); lc.push_back(-1); rc.push_back(-1);
		return st.size()-1;
	}

	void _upd(pii a,Int v=0,Int tl=L,Int tr=R){
		if(eval(a,mid) > eval(st[v],mid)) swap(a, st[v]);
		if(eval(a,tl) > eval(st[v],tl)){
			if(lc[v]==-1) lc[v] = make(), st[lc[v]] = st[v];
			_upd(a, lc[v],tl,mid);
		}
		if(eval(a,tr) > eval(st[v],tr)){
			if(rc[v]==-1) rc[v] = make(), st[rc[v]] = st[v];
			_upd(a, rc[v],mid+1,tr);
		}
	}
	void upd(pii a){
		MINCHT ? _upd({-a.ff,-a.ss}) : _upd(a);
	}
	void upd(Int m,Int c){upd({m,c});}

	Int _qry(Int x,Int v=0,Int tl=L,Int tr=R){
		if(v==-1) return -INF;
		if(tl==tr) return eval(st[v],x);
		if(x <= mid) return max(eval(st[v],x), _qry(x, lc[v],tl,mid));
		else return max(eval(st[v],x), _qry(x, rc[v],mid+1,tr));
	}
	Int qry(Int x){
		return MINCHT ? -_qry(x):_qry(x);
	}
} cht;
#undef mid



const int N = 5e4+5;
const int K = 505;
const int M = 1e6+5;

int n, m, k;

Int dp[N][2];
inline Int sqr(Int x){return x*x;}



Int take_photos(int _n,int _m,int _k,V<int> l,V<int> r){
	n = _n; m = _m; k = _k;

	// remove subsegments
	V<int> ord;
	rep(i,0,n){
		if(l[i] > r[i]) swap(l[i], r[i]);
		ord.push_back(i);
	}
	sort(all(ord),[&](int i,int j){
		if(l[i]==l[j]) return r[i] < r[j];
		return l[i] > l[j];
	});
	V<int> stak;
	for(int i : ord){
		while(!stak.empty() && r[stak.back()]<=r[i]) stak.pop_back();
		stak.push_back(i);
	}
	reverse(all(stak));
	ord.swap(stak);
	// result is ordered from l

	// reorder l[] and r[]
	{
		V<int> vl, vr;
		for(int i : ord){
			// cerr << l[i] _ r[i] << nl;
			vl.push_back(l[i]);
			vr.push_back(r[i]);
		}
		l.swap(vl);
		r.swap(vr);
	}
	n = ord.size();

	// // dp[0][p]
	// rep(p,1,k+1) dp[0][p] = sqr(r[0]-l[0]+1);
	// dp[i][0]
	rep(i,0,n) dp[i][0] = INF;

	rep(pp,1,k+1){
		int p = pp&1;
		// dbg(p);

		dp[0][p] = sqr(r[0]-l[0]+1);
		rep(i,1,n){
			// dp[i][p] = sqr(r[i]-l[0]+1);
			// rep(j,1,i+1) dp[i][p] = min(dp[i][p],
			// 	dp[j-1][p^1] +sqr(r[i]-l[j]+1) -(l[j]<=r[j-1] ? sqr(r[j-1]-l[j]+1):0)
			// );

			if(l[i] <= r[i-1]){
				cht.upd(-2*l[i], l[i]*l[i]-2*l[i] +dp[i-1][p^1] -sqr(r[i-1]-l[i]+1));
			}
			else{
				cht.upd(-2*l[i], l[i]*l[i]-2*l[i] +dp[i-1][p^1]);
			}

			dp[i][p] = r[i]*r[i] +2*r[i] +1 +cht.qry(r[i]);
			dp[i][p] = min(dp[i][p], sqr(r[i]-l[0]+1));
			// dbg(dp[i][p]);
		}
	}


	Int ans = dp[n-1][k&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...