Submission #1321692

#TimeUsernameProblemLanguageResultExecution timeMemory
1321692miniobSightseeing in Kyoto (JOI22_kyoto)C++20
100 / 100
65 ms3856 KiB
#include <bits/stdc++.h>
using namespace std;

long long a[100007];
long long b[100007];

int main() 
{
	long long h, w;
	cin >> h >> w;
	vector<pair<long long, long long>> ra;
	vector<pair<long long, long long>> rb;
	for(long long i = 0; i < h; i++)
	{
		cin >> a[i];
	}
	for(long long i = 0; i < w; i++)
	{
		cin >> b[i];
	}
	for(long long i = 1; i < h; i++)
	{
		pair<long long, long long> cur;
		cur = {1, a[i] - a[i - 1]};
		while(!ra.empty() && (__int128)ra.back().second * (__int128)cur.first >= (__int128)cur.second * (__int128)ra.back().first)
		{
			cur.first += ra.back().first;
			cur.second += ra.back().second;
			ra.pop_back();
		}
		ra.push_back(cur);
	}
	for(long long i = 1; i < w; i++)
	{
		pair<long long, long long> cur;
		cur = {1, b[i] - b[i - 1]};
		while(!rb.empty() && (__int128)rb.back().second * (__int128)cur.first >= (__int128)cur.second * (__int128)rb.back().first)
		{
			cur.first += rb.back().first;
			cur.second += rb.back().second;
			rb.pop_back();
		}
		rb.push_back(cur);
	}
	long long p1, p2, it1, it2, odp = 0;
	p1 = p2 = it1 = it2 = 0;
	while(it1 != ra.size() || it2 != rb.size())
	{
		bool czyp = false;
		if(it2 == rb.size())
		{
			czyp = true;
		}
		else if(it1 != ra.size() && (__int128)ra[it1].second * (__int128)rb[it2].first < (__int128)rb[it2].second * (__int128)ra[it1].first)
		{
			czyp = true;
		}
		if(czyp)
		{
			odp += p2 * ra[it1].first;
			p1 += ra[it1].second;
			it1++;
		}
		else
		{
			odp += p1 * rb[it2].first;
			p2 += rb[it2].second;
			it2++;
		}
	}
	cout << odp + a[0] * (w - (long long)1) + b[0] * (h - (long long)1) << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...