답안 #954035

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
954035 2024-03-27T06:37:08 Z TAhmed33 Peru (RMI20_peru) C++17
0 / 100
15 ms 14684 KB
#include <bits/stdc++.h>
#include <peru.h>
using namespace std;
typedef long long ll;
const ll inf = 1e16;
const int MAXN = 2'500'000 + 25;
const int MOD = 1e9 + 7;
int add (int a, int b) {
	a += b; if (a >= MOD) a -= MOD;
	return a;
}
int sub (int a, int b) {
	a -= b; if (a < 0) a += MOD;
	return a;
}
int mul (int a, int b) {
	return (a * 1ll * b) % MOD;
}
int pw[MAXN];
ll a[MAXN], n, k;
deque <array <ll, 4>> cur;
deque <ll> dd;
ll dp[MAXN];
struct MinimumStack {
	stack <pair <ll, ll>> dd;
	ll get () {
		return dd.empty() ? inf : dd.top().second;
	}
	void pop() { dd.pop(); }
	bool empty () { return dd.empty(); }
	void push (ll x) {
		ll mn = x; if (!empty()) x = min(x, get());
		dd.push({x, mn});
	}	
	int size () {
		return (int)dd.size();
	}
	ll top () { return dd.empty() ? inf : dd.top().first; }
	void swap (MinimumStack &x) {
		dd.swap(x.dd);
	}
};
struct MonotonicDeque {
	deque <ll> cur;
	void push_front (ll x) {
		cur.push_front(x);
	}
	void push_back (ll x) {
		cur.push_back(x);
	}
	void pop_front () {
		cur.pop_front();
	}
	void pop_back () {
		cur.pop_back();
	}
	ll get () {
		ll ret = 1e18;
		for (auto i : cur) ret = min(ret, i);
		return ret;
	}
	// MinimumStack left, right, temp;
	// void upd () {
	// 	if (right.empty() && left.empty()) return;
	// 	bool f = 0;
	// 	if (right.empty()) {
	// 		f = 1; left.swap(right); 
	// 	}
	// 	int x = (int)right.size() / 2;
	// 	while (x--) {
	// 		temp.push(right.top());
	// 		right.pop();
	// 	}
	// 	while (!right.empty()) {
	// 		left.push(right.top()); right.pop();
	// 	}
	// 	while (!temp.empty()) {
	// 		right.push(temp.top()); temp.pop();
	// 	}
	// 	if (f) {
	// 		left.swap(right);
	// 	}
	// }
	// ll get () {
	// 	return min(left.get(), right.get());
	// }
	// int size () {
	// 	return (int)left.size() + (int)right.size();
	// }
	// bool empty() {
	// 	return size() == 0;
	// }
	// void push_back (ll x) {
	// 	right.push(x);
	// }
	// void pop_back() {
	// 	if (right.empty()) upd();
	// 	right.pop();
	// }
	// void push_front (ll x) {
	// 	left.push(x);
	// }
	// void pop_front() {
	// 	if (left.empty()) upd();
	// 	left.pop();
	// }
	// ll back () {
	// 	if (right.empty()) upd();
	// 	return right.top();
	// }
	// ll front () {
	// 	if (left.empty()) upd();
	// 	return left.top();
	// }
} cur2;
int solve (int n, int k, int *a) {
	pw[0] = 1; for (int i = 1; i < MAXN; i++) {
		pw[i] = mul(23, pw[i - 1]);
	}
	int last = 0;
	for (int i = 1; i <= n; i++) {
		array <ll, 4> v = {i, i - 1, i - 1, dp[i - 1]};
		while (!cur.empty() && a[cur.back()[0] - 1] < a[i - 1]) {
			v[1] = cur.back()[1], v[3] = min(v[3], cur.back()[3]);
			cur.pop_back();
			if (last != cur.back()[0]) cur2.pop_back();
		}
		cur.push_back(v); 
		while (!cur.empty() && cur[0][0] <= i - k) {
			if (cur.size()!=1) cur2.pop_front();
			cur.pop_front();
		}
		for (int j = last; j < cur[0][0]; j++) {
			while (!dd.empty() && dp[dd.back()] >= dp[j]) dd.pop_back(); 
			dd.push_back(j);
		}
		last = cur[0][0];
		while (!dd.empty() && dd.front() < i - k) dd.pop_front();
		/*cout << i << ": \n";
		for (auto j : cur) {
			for (auto l : j) cout << l << " ";
			cout << '\n';
		}
		cout << '\n';
		for (auto j : dd) cout << j << " ";
		cout << '\n' << '\n';
*/
		if (cur[0][0] != i) {
			//cout << "??\n";
			cur2.push_back(a[i - 1] + v[3]);
		}
		//cout << cur[0][0] << " " << a[cur[0][0] - 1] << " " << dd.front() << " " << dp[dd.front()] << '\n';
		ll mx = a[cur[0][0] - 1] + dp[dd.front()];
		//mx = min(mx, cur2.get());
for(auto j:cur)mx=min(mx,a[j[0]-1]+j[3]);
		/*cout << cur2.get() << '\n';
		for (auto j : cur2.cur) cout << j << " ";
		cout << '\n';*/
		dp[i] = mx;
	}
	//for (int i = 1; i <= n; i++) cout << dp[i] << " ";
	//cout << '\n';
	int ret = 0;
	for (int i = 1; i <= n; i++) ret = add(ret, mul(dp[i] % MOD, pw[n - i]));
	return ret;
}
/*
int main () {
	int n, k; cin >> n >> k;
	int a[n + 1] = {};
	for (int i = 0; i < n; i++) cin >> a[i];
	cout << solve(n, k, a) << '\n';
}*/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 15 ms 14684 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 15 ms 14684 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 15 ms 14684 KB Output isn't correct
2 Halted 0 ms 0 KB -