제출 #785098

#제출 시각아이디문제언어결과실행 시간메모리
785098QwertyPiMeetings (IOI18_meetings)C++14
19 / 100
5518 ms8056 KiB
#include "meetings.h"
#include <bits/stdc++.h>
#define INF (1 << 30)
#define INFL (1LL << 60)
#define fi first
#define se second
#define ll long long

using namespace std;
 
const int MAXN = 7.5e5 + 11;
long long fl[MAXN], fr[MAXN];

vector<int> H;

vector<long long> calc(int l, int r){
	vector<long long> res(r - l + 1);
	vector<pair<int, int>> F;
	long long cost = 0;
	F.push_back({l - 1, INF});
	for(int j = l; j <= r; j++){
		while(H[j] >= F.back().se) cost -= (long long) (F.back().fi - F[F.size() - 2].fi) * F.back().se, F.pop_back();
		F.push_back({j, H[j]}); cost += (long long) (F.back().fi - F[F.size() - 2].fi) * F.back().se;
		res[j - l] = cost;
	}
	return res;
}

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L,
                                     std::vector<int> R) {
    ::H = H;
  	int Q = L.size();
  	vector<ll> C(Q); 
    for(int i = 0; i < Q; i++){
    	int l = L[i], r = R[i];
    	vector<ll> a = calc(l, r);
    	reverse(::H.begin() + l, ::H.begin() + r + 1);
    	vector<ll> b = calc(l, r);
    	reverse(::H.begin() + l, ::H.begin() + r + 1);
    	reverse(b.begin(), b.end());
    	long long ans = INFL;
    	for(int i = 0; i <= r - l; i++){
    		ans = min(ans, a[i] + b[i] - H[l + i]);
		}
		C[i] = ans;
	}
  	return C;
}
#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...