제출 #320646

#제출 시각아이디문제언어결과실행 시간메모리
320646egasDischarging (NOI20_discharging)C++14
100 / 100
185 ms23968 KiB
#include <bits/stdc++.h> using namespace std; class CHT { private: class Line { long long m,c; public: Line(long long m,long long c) { this->m=m; this->c=c; } long long getVal(long long x) { return this->m*x + c; } long long intersect(Line &a) { return ceil((a.c - this->c)/(long double)(this->m - a.m)); } }; deque<pair<Line,long long>> dq; public: void insert(long long m,long long c) { Line temp(m,c); while(dq.size()>1 and dq.back().second>=dq.back().first.intersect(temp)) { dq.pop_back(); } if(dq.size()==0) { dq.push_back({temp,0}); } else { dq.push_back({temp,dq.back().first.intersect(temp)}); } } long long query(long long x) { while(dq.size()>1) { if(dq[1].second<=x) { dq.pop_front(); } else { break; } } return dq[0].first.getVal(x); } }; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); long long n; cin >> n; vector<long long> a(n); for(long long i = 0 ; i < n ; i++) { cin >> a[i]; } long long dp[n]; dp[0]=a[0]*n; long long maxi[n]; maxi[0]=a[0]; for(long long i = 0 ; i < n ; i++) { if(i==0) { continue; } maxi[i]=max(maxi[i-1],a[i]); } CHT meat; meat.insert(n,0); for(long long i = 0 ; i < n ; i++) { if(i==0)continue; meat.insert(n-i,dp[i-1]); dp[i]=meat.query(maxi[i]); } cout << dp[n-1] << '\n'; return 0; }
#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...