Submission #1369507

#TimeUsernameProblemLanguageResultExecution timeMemory
1369507gohchingjaykMonsters (NOI25_monsters)C++20
100 / 100
59 ms6672 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll

using ii = pair<int, int>;
using iii = pair<ii, int>;
#pragma GCC optimize("O3")

constexpr int MAXN = 200'000 + 5;
constexpr int INF = 1e18 + 5;

vector<ii> monsters;
vector<int> mines;

// [left_yes][right_yes];
int dp[2][2];

signed main() {
	ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

	int N, K; cin >> N >> K;
	
	monsters.resize(N);
	dp[0][0] = dp[0][1] = dp[1][0] = dp[1][1] = INF;
	dp[0][0] = 0;
	mines.resize(K);
	
	for (int i = 0; i < N; ++i) cin >> monsters[i].first >> monsters[i].second;
	for (int i = 0; i < K; ++i) cin >> mines[i];
	
	K++;
	mines.emplace_back(INF);
	
	sort(monsters.begin(), monsters.end());
	sort(mines.begin(), mines.end());
	
	int ptr = 0;
	for (int i = 0; i < K; ++i) {
		while (ptr < N && monsters[ptr].first <= mines[i]) {
			int left = i == 0 ? -INF : mines[i-1];
			int right = mines[i];
			
			int ldist = abs(left - monsters[ptr].first);
			int rdist = abs(right - monsters[ptr].first);
			int healt = monsters[ptr].second;
			
			int newDp[2][2];
			
			newDp[0][0] = dp[0][0] + healt;
			newDp[1][0] = min({dp[0][0] + ldist + 1, dp[1][0] + ldist, dp[1][0] + healt});
			newDp[0][1] = min({dp[0][0] + rdist + 1, dp[0][1] + rdist, dp[0][1] + healt});
			newDp[1][1] = min({dp[1][1] + healt,
							   dp[1][1] + ldist,
							   dp[1][1] + rdist,
							   dp[0][1] + ldist + 1,
							   dp[1][0] + rdist + 1});
			
			memcpy(dp, newDp, sizeof(dp));
			ptr++;
		}
		
		int newDp[2][2];
		
		newDp[0][0] = min(dp[0][0], dp[1][0]);
		newDp[1][0] = min(dp[0][1], dp[1][1]);
		newDp[0][1] = INF;
		newDp[1][1] = INF;
		
		memcpy(dp, newDp, sizeof(dp));
	}
	
	int ans = min({dp[0][0], dp[0][1], dp[1][0], dp[1][1]});
	cout << ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...