Submission #1354420

#TimeUsernameProblemLanguageResultExecution timeMemory
1354420MuhammadSaramDischarging (NOI20_discharging)C++20
100 / 100
213 ms23892 KiB
#include <bits/stdc++.h>

using namespace std;

#define int __int128
#define ll long long

vector<pair<int,int>> cht;

pair<int,int> ins(pair<int,int> p, pair<int,int> p1)
{
	int m=p.first, c=p.second, m1=p1.first, c1=p1.second;
	pair<int,int> ans={c1-c,m-m1};
	return ans; 
}

bool comp(pair<int,int> p, pair<int,int> p1)
{
	return p.first*p1.second<=p1.first*p.second;
}

void add(int m,int c)
{
	cht.push_back({m,c});
	while (cht.size()>2)
	{
		int x=cht.size();
		pair<int,int> p=cht[x-3], p1=cht[x-2], p2=cht[x-1];
		if (comp(ins(p1,p2),ins(p,p1))) swap(cht[x-2],cht[x-1]), cht.pop_back();
		else break;
	}
}

int get(int x)
{
	int s=0, e=cht.size();
	while (s+1<e)
	{
		int mid=(s+e)/2;
		int o=cht[mid-1].first*x+cht[mid-1].second,
		p=cht[mid].first*x+cht[mid].second;
		if (p<o) s=mid;
		else e=mid;
	}
	return cht[s].first*x+cht[s].second;
}

signed main()
{
	ll n;
	cin>>n;
	ll a[n+1];
	for (int i=1;i<=n;i++)
		cin>>a[i];
	int pre[n+1]={};
	add(n, 0);
	int mx=0, id=0;
	for (int i=1;i<=n;i++)
	{
		if (a[i]>mx)
			mx=a[i], id=i;
		ll val=get(mx);
		if (i==n)
			cout<<val<<endl;
		add(n-i,val);
	}

	return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...