結果
問題 |
No.2036 Max Middle
|
ユーザー |
![]() |
提出日時 | 2025-05-14 13:06:35 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 5,323 bytes |
コンパイル時間 | 829 ms |
コンパイル使用メモリ | 86,576 KB |
実行使用メモリ | 7,840 KB |
最終ジャッジ日時 | 2025-05-14 13:07:46 |
合計ジャッジ時間 | 5,304 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 4 TLE * 1 -- * 12 |
ソースコード
#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <vector> // Ensure vector is included using namespace std; int main() { // Faster I/O operations ios_base::sync_with_stdio(false); cin.tie(NULL); int N; // Length of the sequence cin >> N; // Use vector<long long> to store the sequence elements, accommodating large values. vector<long long> A(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } // The queue will store the indices 'i' (1-based, as per problem statement) // where an operation can potentially be performed. // An operation index 'i' corresponds to checking elements A_i, A_{i+1}, A_{i+2} // and modifying A_{i+1}. queue<int> q; // `is_in_queue` tracks if an operation index 'i' (1 to N-2) is currently in the queue. // We use a vector of size N for simplicity, mapping operation index `i` to `is_in_queue[i]`. // Indices 0 and N-1 will not be used for tracking operation indices. vector<bool> is_in_queue(N, false); // Initial scan to find all eligible indices for the operation. // Iterate through possible operation indices i = 1 to N-2. for (int i = 1; i <= N - 2; ++i) { // Check the condition A_i < A_{i+1} and A_{i+1} > A_{i+2}. // Using 0-based indexing for vector A, this corresponds to checking A[i-1], A[i], A[i+1]. if (A[i-1] < A[i] && A[i] > A[i+1]) { q.push(i); // Add eligible index to the queue is_in_queue[i] = true; // Mark index `i` as being in the queue } } // `count` stores the total number of operations performed. Use long long as it might exceed 32-bit integer limits. long long count = 0; // Process the queue until it's empty (no more eligible operations). while (!q.empty()) { int i = q.front(); // Get the next operation index from the front of the queue. q.pop(); // Remove the index from the queue. is_in_queue[i] = false; // Mark index `i` as removed from the queue. // Sanity check if the index 'i' is within the valid range [1, N-2]. // This should theoretically always be true if logic is correct, but good for safety. if (i < 1 || i > N - 2) continue; // Re-check eligibility before performing the operation. The state of A might have changed // due to operations performed on neighboring indices which could affect A[i-1] or A[i+1]. // The condition still involves elements A[i-1], A[i], A[i+1]. if (A[i-1] < A[i] && A[i] > A[i+1]) { // Perform the operation: modify A[i] (which corresponds to A_{i+1} in the problem statement). // The new value is min(A_i, A_{i+2}) - 1, which translates to min(A[i-1], A[i+1]) - 1 in 0-based indexing. A[i] = min(A[i-1], A[i+1]) - 1; count++; // Increment the operation count. // After modifying A[i], the eligibility of neighboring operations might change. // We need to check if operations at index i-1 or i+1 became eligible. // Check eligibility of operation index i-1. int prev_op_idx = i - 1; // Check if prev_op_idx is a valid operation index (1 <= prev_op_idx <= N-2). if (prev_op_idx >= 1) { // The eligibility condition for operation index prev_op_idx involves elements // A[prev_op_idx-1], A[prev_op_idx], A[prev_op_idx+1], which are A[i-2], A[i-1], A[i]. // Check if A[i-2] < A[i-1] and A[i-1] > A[i] holds (using the potentially new value of A[i]). // Boundary check for A[i-2]: required i-2 >= 0, which means i >= 2. This is guaranteed since prev_op_idx >= 1 implies i >= 2. if (A[i-2] < A[i-1] && A[i-1] > A[i]) { // If operation at prev_op_idx is now eligible and not already in the queue, add it. if (!is_in_queue[prev_op_idx]) { q.push(prev_op_idx); is_in_queue[prev_op_idx] = true; } } } // Check eligibility of operation index i+1. int next_op_idx = i + 1; // Check if next_op_idx is a valid operation index (1 <= next_op_idx <= N-2). if (next_op_idx <= N - 2) { // The eligibility condition for operation index next_op_idx involves elements // A[next_op_idx-1], A[next_op_idx], A[next_op_idx+1], which are A[i], A[i+1], A[i+2]. // Check if A[i] < A[i+1] and A[i+1] > A[i+2] holds (using the potentially new value of A[i]). // Boundary check for A[i+2]: required i+2 < N. This is guaranteed since next_op_idx <= N-2 implies i <= N-3, so i+2 <= N-1 < N. if (A[i] < A[i+1] && A[i+1] > A[i+2]) { // If operation at next_op_idx is now eligible and not already in the queue, add it. if (!is_in_queue[next_op_idx]) { q.push(next_op_idx); is_in_queue[next_op_idx] = true; } } } } } // Output the total number of operations performed. cout << count << endl; return 0; }