Submission #135582

#TimeUsernameProblemLanguageResultExecution timeMemory
135582random0029Aliens (IOI16_aliens)C++14
60 / 100
533 ms67052 KiB
// ItnoE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct CHT
{
	typedef pair < ll , ll > Line;
	vector < pair < ll , Line > > A;
	ll INF = (ll)1e18;
	inline void Clear()
	{
		A.clear();
	}
	inline void Add(Line X)
	{
		while (A.size() && Intersection(A.back().second, X) <= A.back().first)
			A.pop_back();
		if (A.size())
			A.push_back({Intersection(A.back().second, X), X});
		else
			A.push_back({-INF, X});
	}
	inline ll GetMax(ll X)
	{
		int lb = upper_bound(A.begin(), A.end(), pair < ll , Line > {X, {INF, INF}}) - A.begin() - 1;
		return (A[lb].second.first * X + A[lb].second.second);
	}
	inline ll Intersection(Line X, Line Y)
	{
		if (X.first == Y.first && X.second <= Y.second)
			return (-INF);
		if (X.first == Y.first)
			return (INF);
		return ((X.second - Y.second) / (Y.first - X.first)) + ((X.second - Y.second) % (Y.first - X.first) > 0);
	}
};
const int N = 50004, MXM = 1e6 + 10;
int n, m, A[N], B[N], F[N], MN[MXM];
inline ll SQR(ll a) {return (a * a);}
int64_t take_photos(int q, int mm, int k, vector < int > RG, vector < int > CG)
{
	m = mm;
	memset(MN, 63, sizeof(MN));
	for (int i = 0; i < q; i ++)
	{
		if (RG[i] > CG[i])
			swap(RG[i], CG[i]);
		MN[CG[i]] = min(MN[CG[i]], RG[i]);
	}
	for (int i = 0; i < m; i ++)
		if (MN[i] <= i)
		{
			int b = i, a = i - MN[i] + 1;
			while (n && B[n] - A[n] >= b - a)
				n --;
			n ++; B[n] = b; A[n] = a;
			F[n] = B[n] - A[n];
		}
	CHT C;
	ll dp[k + 5][n + 5];
	memset(dp, 63, sizeof(dp));
	for (int i = 0; i <= k; i ++)
		dp[i][0] = 0;
	k = min(k, n);
	for (int j = 1; j <= k; j ++)
	{
		C.Clear();
		for (int i = 1; i <= n; i ++)
		{
			ll vl = dp[j - 1][i - 1] + SQR(F[i]);
			if (i > 1 && B[i - 1] > F[i])
				vl -= SQR(B[i - 1] - F[i]);
			if (vl <= (ll)(1e16))
				C.Add({F[i], - vl});
			dp[j][i] = min(dp[j - 1][i], -C.GetMax(2 * B[i]) + SQR(B[i]));
		}
	}

	/*for (int j = 1; j <= k; j ++)
	{
		for (int i = 1; i <= n; i ++)
		{
			dp[j][i] = dp[j - 1][i];
			for (int h = 1; h <= i; h ++)
			{
				ll vl = dp[j - 1][h - 1];
				vl += SQR(B[i] - B[h] + A[h]);
				if (h > 1 && B[h - 1] > B[h] - A[h])
					vl -= SQR(B[h - 1] - (B[h] - A[h]));
				dp[j][i] = min(dp[j][i], vl);
			}
		}
	}*/

	return (dp[k][n]);
}
/*int main()
{
	int q = 2;//5;
	int mm = 6;//7;
	int k = 2;
	vector < int > _R = {1, 4};//{0, 4, 4, 4, 4};
	vector < int > _C = {4, 1};//{3, 4, 6, 5, 6};
	ll Res = take_photos(q, mm, k, _R, _C);
	cout << Res << endl;
}*/
#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...