#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |