답안 #300016

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
300016 2020-09-16T06:51:19 Z square1001 모임들 (IOI18_meetings) C++14
60 / 100
3872 ms 36892 KB
#include "meetings.h"
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1012345678;
long long calc(vector<int> H) {
	int N = H.size();
	vector<pair<int, int> > stairs;
	stairs.push_back(make_pair(inf, -1));
	long long sum = 0;
	vector<long long> sl(N);
	for(int i = 0; i < N; ++i) {
		while(stairs.back().first <= H[i]) {
			pair<int, int> pa = stairs[stairs.size() - 1];
			pair<int, int> pb = stairs[stairs.size() - 2];
			sum -= 1LL * pa.first * (pa.second - pb.second);
			stairs.pop_back();
		}
		sum += 1LL * H[i] * (i - stairs.back().second);
		stairs.push_back(make_pair(H[i], i));
		sl[i] = sum;
	}
	stairs.clear();
	stairs.push_back(make_pair(inf, N));
	sum = 0;
	vector<long long> sr(N);
	for(int i = N - 1; i >= 0; --i) {
		while(stairs.back().first <= H[i]) {
			pair<int, int> pa = stairs[stairs.size() - 1];
			pair<int, int> pb = stairs[stairs.size() - 2];
			sum -= 1LL * pa.first * (pb.second - pa.second);
			stairs.pop_back();
		}
		sum += 1LL * H[i] * (stairs.back().second - i);
		stairs.push_back(make_pair(H[i], i));
		sr[i] = sum;
	}
	long long ans = 1LL << 62;
	for(int i = 0; i < N; ++i) {
		ans = min(ans, sl[i] + sr[i] - H[i]);
	}
	return ans;
}
std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) {
	int N = H.size(), Q = L.size();
	if(N <= 5000 && Q <= 5000) {
		vector<long long> res(Q);
		for(int i = 0; i < Q; ++i) {
			res[i] = calc(vector<int>(H.begin() + L[i], H.begin() + R[i] + 1));
		}
		return res;
	}
	else {
		int Z = *max_element(H.begin(), H.end());
		vector<vector<int> > splitter(Z + 1);
		for(int i = 0; i <= Z; ++i) {
			splitter[i].push_back(0);
			for(int j = 0; j < N; ++j) {
				if(H[j] > i) {
					splitter[i].push_back(j + 1);
				}
			}
			splitter[i].push_back(N + 1);
		}
		vector<int> spsize(Z + 1);
		for(int i = 0; i <= Z; ++i) {
			spsize[i] = int(splitter[i].size()) - 1;
		}
		vector<vector<long long> > dp(Z + 1);
		dp[0] = vector<long long>(spsize[0], 1);
		for(int i = 1; i <= Z; ++i) {
			dp[i].resize(spsize[i]);
			for(int j = 0; j < spsize[i]; ++j) {
				int pl = lower_bound(splitter[i - 1].begin(), splitter[i - 1].end(), splitter[i][j]) - splitter[i - 1].begin();
				int pr = lower_bound(splitter[i - 1].begin(), splitter[i - 1].end(), splitter[i][j + 1]) - splitter[i - 1].begin();
				int mx = *max_element(dp[i - 1].begin() + pl, dp[i - 1].begin() + pr);
				dp[i][j] = mx + (splitter[i][j + 1] - splitter[i][j]);
			}
		}
		vector<long long> res(Q);
		for(int i = 0; i < Q; ++i) {
			// part #0. precalc
			vector<int> pl(Z + 1), pr(Z + 1);
			for(int j = 0; j <= Z; ++j) {
				pl[j] = splitter[j][lower_bound(splitter[j].begin(), splitter[j].end(), L[i] + 1) - splitter[j].begin()];
				pr[j] = splitter[j][lower_bound(splitter[j].begin(), splitter[j].end(), R[i] + 2) - splitter[j].begin() - 1];
			}
			int height = 0;
			for(int j = 0; j <= Z; ++j) {
				if(pl[j] <= pr[j]) {
					height = j;
				}
			}
			long long ans = 0;
			// part #1. midvaue
			int sl = lower_bound(splitter[height].begin(), splitter[height].end(), L[i] + 1) - splitter[height].begin();
			int sr = lower_bound(splitter[height].begin(), splitter[height].end(), R[i] + 2) - splitter[height].begin();
			for(int j = sl; j < sr - 1; ++j) {
				ans = max(ans, dp[height][j]);
			}
			// part #2. leftvalue
			long long suml = 0;
			for(int j = height - 1; j >= 0; --j) {
				suml += pl[j + 1] - L[i];
				int tl = lower_bound(splitter[j].begin(), splitter[j].end(), pl[j]) - splitter[j].begin();
				int tr = lower_bound(splitter[j].begin(), splitter[j].end(), pl[j + 1]) - splitter[j].begin();
				for(int k = tl; k < tr; ++k) {
					ans = max(ans, suml + dp[j][k]);
				}
			}
			suml += pl[0] - L[i];
			ans = max(ans, suml);
			// part #3. rightvalue
			long long sumr = 0;
			for(int j = height - 1; j >= 0; --j) {
				sumr += (R[i] + 2) - pr[j + 1];
				int tl = lower_bound(splitter[j].begin(), splitter[j].end(), pr[j + 1]) - splitter[j].begin();
				int tr = lower_bound(splitter[j].begin(), splitter[j].end(), pr[j]) - splitter[j].begin();
				for(int k = tl; k < tr; ++k) {
					ans = max(ans, sumr + dp[j][k]);
				}
			}
			sumr += (R[i] + 2) - pr[0];
			ans = max(ans, sumr);
			res[i] = 1LL * (height + 1) * (R[i] - L[i] + 2) - ans;
		}
		return res;
	}
	return vector<long long>();
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 315 ms 724 KB Output is correct
11 Correct 919 ms 760 KB Output is correct
12 Correct 299 ms 760 KB Output is correct
13 Correct 908 ms 760 KB Output is correct
14 Correct 253 ms 760 KB Output is correct
15 Correct 249 ms 760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 153 ms 1744 KB Output is correct
3 Correct 2129 ms 5616 KB Output is correct
4 Correct 250 ms 4720 KB Output is correct
5 Correct 168 ms 5488 KB Output is correct
6 Correct 248 ms 5616 KB Output is correct
7 Correct 3289 ms 5656 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 153 ms 1744 KB Output is correct
3 Correct 2129 ms 5616 KB Output is correct
4 Correct 250 ms 4720 KB Output is correct
5 Correct 168 ms 5488 KB Output is correct
6 Correct 248 ms 5616 KB Output is correct
7 Correct 3289 ms 5656 KB Output is correct
8 Correct 1764 ms 16180 KB Output is correct
9 Correct 1495 ms 16000 KB Output is correct
10 Correct 1664 ms 15984 KB Output is correct
11 Correct 1607 ms 15436 KB Output is correct
12 Correct 929 ms 15380 KB Output is correct
13 Correct 1574 ms 15376 KB Output is correct
14 Correct 3872 ms 21476 KB Output is correct
15 Correct 821 ms 6640 KB Output is correct
16 Correct 3586 ms 15972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 315 ms 724 KB Output is correct
11 Correct 919 ms 760 KB Output is correct
12 Correct 299 ms 760 KB Output is correct
13 Correct 908 ms 760 KB Output is correct
14 Correct 253 ms 760 KB Output is correct
15 Correct 249 ms 760 KB Output is correct
16 Correct 1 ms 256 KB Output is correct
17 Correct 153 ms 1744 KB Output is correct
18 Correct 2129 ms 5616 KB Output is correct
19 Correct 250 ms 4720 KB Output is correct
20 Correct 168 ms 5488 KB Output is correct
21 Correct 248 ms 5616 KB Output is correct
22 Correct 3289 ms 5656 KB Output is correct
23 Correct 1764 ms 16180 KB Output is correct
24 Correct 1495 ms 16000 KB Output is correct
25 Correct 1664 ms 15984 KB Output is correct
26 Correct 1607 ms 15436 KB Output is correct
27 Correct 929 ms 15380 KB Output is correct
28 Correct 1574 ms 15376 KB Output is correct
29 Correct 3872 ms 21476 KB Output is correct
30 Correct 821 ms 6640 KB Output is correct
31 Correct 3586 ms 15972 KB Output is correct
32 Runtime error 436 ms 36892 KB Execution killed with signal 11
33 Halted 0 ms 0 KB -