/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 532.0 KiB
#2 Accepted 17ms 532.0 KiB
#3 Accepted 26ms 624.0 KiB
#4 Accepted 24ms 532.0 KiB
#5 Accepted 22ms 532.0 KiB
#6 Accepted 26ms 1.344 MiB
#7 Accepted 23ms 3.566 MiB
#8 Accepted 24ms 4.27 MiB
#9 Accepted 53ms 4.074 MiB
#10 Accepted 27ms 3.871 MiB
#11 Accepted 28ms 4.27 MiB
#12 Accepted 26ms 4.07 MiB

Code

#include <bits/stdc++.h>
using namespace std;

static const long long INF = LLONG_MAX;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T; 
    cin >> T;
    while(T--) {
        int N, K;
        cin >> N >> K;
        vector<long long> A(N);
        for(int i = 0; i < N; i++){
            cin >> A[i];
        }

        vector<long long> prefixSum(N+1, 0LL);
        for(int i = 1; i <= N; i++){
            prefixSum[i] = prefixSum[i-1] + A[i-1];
        }

        vector<long long> prefixMin(N), suffixMin(N);
        prefixMin[0] = A[0];
        for(int i = 1; i < N; i++){
            prefixMin[i] = std::min(prefixMin[i-1], A[i]);
        }
        suffixMin[N-1] = A[N-1];
        for(int i = N-2; i >= 0; i--){
            suffixMin[i] = std::min(suffixMin[i+1], A[i]);
        }

        vector<long long> maxInWindow(N - K + 1);

        deque<int> dq;
        
        for(int i = 0; i < K; i++){
            while(!dq.empty() && A[i] >= A[dq.back()]){
                dq.pop_back();
            }
            dq.push_back(i);
        }
        maxInWindow[0] = A[dq.front()];

        for(int i = K; i < N; i++){
            while(!dq.empty() && dq.front() <= i - K){
                dq.pop_front();
            }
            while(!dq.empty() && A[i] >= A[dq.back()]){
                dq.pop_back();
            }
            dq.push_back(i);

            maxInWindow[i - K + 1] = A[dq.front()];
        }

        long long ans = LLONG_MAX;

        for(int start = 0; start <= N - K; start++){
            long long subSum = prefixSum[start + K] - prefixSum[start];
            long long insideMax = maxInWindow[start];

            long long outMin = INF;
            if(start > 0) {
                outMin = min(outMin, prefixMin[start - 1]);
            }
            if(start + K < N) {
                outMin = min(outMin, suffixMin[start + K]);
            }

            long long bestSumAfterSwap = subSum;
            if(outMin != INF) {
                long long diff = insideMax - outMin;
                if(diff > 0) {
                    bestSumAfterSwap = subSum - diff;
                }
            }
            ans = min(ans, bestSumAfterSwap);
        }

       

        cout << ans << "\n";
    }

    return 0;
}

Information

Submit By
Type
Submission
Problem
P1149 Swap and Minimize
Language
C++17 (G++ 13.2.0)
Submit At
2025-01-02 00:05:03
Judged At
2025-01-02 00:05:03
Judged By
Score
100
Total Time
53ms
Peak Memory
4.27 MiB