Submission #1334475

#TimeUsernameProblemLanguageResultExecution timeMemory
1334475Jawad_Akbar_JJMeetings (IOI18_meetings)C++20
0 / 100
17 ms3264 KiB
#include <iostream>
#include <vector>
// #include "meetings.h"

using namespace std;
const int N = 1<<20;
int Mx[N][20];
long long pre[N], suf[N];
vector<long long> Ans;
vector<int> quer[N];

void solve(vector<int> &H, vector<int> &L, vector<int> &R, int l, int r){
	if (r < l)
		return;
	int b = 31 - __builtin_clz(r - l + 1), m = Mx[r - (1<<b) + 1][b];
	if (H[Mx[l][b]] > H[m])
		m = Mx[l][b];

	solve(H, L, R, l, m - 1);
	solve(H, L, R, m + 1, r);

	for (int i : quer[m])
		Ans[i] = min(suf[L[i]] + 1LL * (R[i] - m + 1) * H[m], pre[R[i]] + 1LL * (m - L[i] + 1) * H[m]);

	pre[m] = (m > l ? pre[m - 1] : 0) + H[m];
	for (int i=m+1;i<=r;i++)
		pre[i] = min(pre[i] + 1LL * (m - L[i] + 1) * H[m], pre[m] + 1LL * (i - m) * H[m]);

	suf[m] = (r > m ? suf[m + 1] : 0) + H[m];
	for (int i=m-1;i>=l;i--)
		suf[i] = min(suf[i] + 1LL * (R[i] - m + 1) * H[m], suf[m] + 1LL * (m - i) * H[m]);
}

vector<long long> minimum_costs(vector<int> H, vector<int> L, vector<int> R){
	int n = H.size(), q = L.size();
	Ans.resize(q, 0);
	for (int i=n-1;i>=0;i--){
		Mx[i][0] = i;
		for (int j=0;j<19;j++){
			if (i + (1<<j) >= n or H[Mx[i+(1<<j)][j]] <= H[Mx[i][j]])
				Mx[i][j+1] = Mx[i][j];
			else
				Mx[i][j+1] = Mx[i + (1<<j)][j];
		}
	}

	for (int i=0;i<q;i++){
		int b = 31 - __builtin_clz(R[i] - L[i] + 1), m = Mx[R[i] - (1<<b) + 1][b];
		if (H[Mx[L[i]][b]] > H[m])
			m = Mx[L[i]][b];
		quer[m].push_back(i);
	}

	solve(H, L, R, 0, n - 1);

	return Ans;
}
#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...