Submission #424525

#TimeUsernameProblemLanguageResultExecution timeMemory
424525jainbot27Aliens (IOI16_aliens)C++17
12 / 100
2 ms2664 KiB
#include <bits/stdc++.h>
using namespace std;

#define f first
#define s second
#define pb push_back
#define ar array
#define all(x) x.begin(), x.end()
#define siz(x) (int) x.size()
#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)
#define FOR(i, a, b) for(auto i=(a); i<(b); i++)
#define ROF(i, a, b) for(auto i=(b)-1; i>=(a); i--)
#define F0R(i, n) FOR(i, 0, n)
#define R0F(i, n) ROF(i, 0, n)

using ll=long long;
using ld=long double;
using pii=pair<int, int>;
using pll=pair<ll, ll>;
using vi=vector<int>;
using vl=vector<ll>;
using vpii=vector<pii>;

template<class T> bool ckmin(T&a, const T&b) {return b<a?a=b,1:0;}
template<class T> bool ckmax(T&a, const T&b) {return b>a?a=b,1:0;}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int mxN=1e5+10;
const int MOD=1e9+7; 
const ll infLL=1e18;
const ld eps=1e-6;

int n, m, k; 
vi r, c; 
vector<pair<ll, ll>> pts, pts2;

struct line{
	ll M, B; int idx;
	ll operator()(const ll&q){
		return M*q+B;
	}
	line(){M=-1, B=-1, idx=-1;}
	line(ll m, ll b, int IDX):M(m), B(b), idx(IDX){}
};

int L, R;

// we can do convex hull in linear cause we only have x is decreasing order

line A[mxN];

bool itersect(line P, line Q, line R){
	if(pair<ll, ll>{(Q.B-P.B)*(Q.M-R.M), Q.idx}>pair<ll, ll>{(R.B-Q.B)*(P.M-Q.M), R.idx})
		return 1;
	return 0;
}

void add(line V){
	while(R-L>1&&itersect(A[R-2], A[R-1], V)) R--; 
	A[R]=V; R++;
}

pair<ll, ll> qry(int X){
	while(R-L>1&&pair<ll, ll>{A[L+1](X), A[L+1].idx}<pair<ll, ll>{A[L](X), A[L].idx}) L++; 
	return {A[L](X), A[L].idx};
}

pair<ll, ll> solve(ll x){
	// cout << "Solve: " << x << "\n";
	pair<ll, ll> dp={0, 0};
	L=0, R=0; 
	F0R(i, n){
		ll A=max(i?pts[i-1].f-pts[i].s+1:0LL, 0LL); 
		add(line(-2*pts[i].s, dp.f-A*A+pts[i].s*pts[i].s, dp.s));;
		dp=qry(pts[i].f+1);
		dp.s++; dp.f+=(pts[i].f+1)*(pts[i].f+1)+x; 
		// cout << dp.f << ' ' << dp.s << "\n";
	}
	return dp;
}

ll take_photos(int N, int M, int K, vi R, vi C){
	n=N, m=M, k=K, r=R, c=C; 
	F0R(i, n){
		pts.pb({max(r[i], c[i]), min(r[i], c[i])});
	}
	sort(all(pts));
	F0R(i, n){
		if(!pts2.empty()&&pts[i].s<=pts2.back().s)
			pts2.pop_back(); 
		pts2.pb(pts[i]);
	}
	swap(pts, pts2); 
	n=siz(pts);
	// for(auto [X, Y]:pts){
	// 	cout << X << ' ' << Y << "\n";
	// }
	ll lo=0, hi=m*m; ll ans=0;
	while(lo<=hi){
		ll m=(lo+hi)/2; 
		auto cur=solve(m);
		if(cur.s<=k) 
			ans=cur.f, hi=m-1;
		else 
			lo=m+1;
	}
	return ans-lo*k;
	// while(lo+1<hi){
	// 	ll m=(lo+hi)/2;
	// 	if(k>=solve(m).s)
	// 		hi=m;
	// 	else 
	// 		lo=m;
	// }
	// // cout << "LO: " << lo << ' ' << "HI: " << hi << "\n";
	// auto ans=solve(lo);
	// return ans.f-lo*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...