Submission

Status:
[PPP][P-SSSS][-S]

Score: 30

User: NJTYTYTY

Problemset: ช่างไฟ

Language: cpp

Time: 0.062 second

Submitted On: 2025-03-21 08:06:40

#include <bits/stdc++.h>
#include <algorithm>
#include <climits>
using namespace std;
#define int long long

const int INF = 1e18; // ค่า INF ที่ใช้เปรียบเทียบ

int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int N;
    cin >> N;
    
    // กรณีไม่มีจุดซ่อมเลย
    if(N == 0){
        cout << 0 << "\n";
        return 0;
    }
    
    // State เริ่มต้น
    int dp_pos = 0;        // P = 0 (nonnegative)
    bool has_neg = false;  // ยังไม่มี state ที่เป็นลบ
    int dp_neg_hi = 0;     // จะเก็บค่าลบที่ใกล้ 0 มากที่สุด (เมื่อมี)
    int dp_neg_lo = 0;     // จะเก็บค่าลบที่ลึกที่สุด (เมื่อมี)
    
    for (int i = 1; i <= N; i++){
        int a;
        cin >> a;
        
        // ค่า state ใหม่
        int new_dp_pos = -INF; // ต้องการค่าที่ nonnegative มากที่สุด
        bool new_has_neg = false;
        int new_dp_neg_hi = -INF; // สำหรับค่าลบที่ใกล้ 0 (มากที่สุดในกลุ่มลบ)
        int new_dp_neg_lo = INF;  // สำหรับค่าลบที่ลึกที่สุด (น้อยที่สุด)
        
        // ฟังก์ชัน lambda เพื่ออัปเดต state จาก candidate ที่ได้
        auto update = [&](int candidate) {
            if(candidate >= 0) {
                new_dp_pos = max(new_dp_pos, candidate);
            } else {
                if(!new_has_neg) {
                    new_has_neg = true;
                    new_dp_neg_hi = candidate;
                    new_dp_neg_lo = candidate;
                } else {
                    new_dp_neg_hi = max(new_dp_neg_hi, candidate); // ใกล้ 0 มากกว่า
                    new_dp_neg_lo = min(new_dp_neg_lo, candidate);  // ลึกกว่าน้อยกว่า
                }
            }
        };
        
        // ลองจาก state nonnegative (dp_pos)
        if(dp_pos != -INF) {
            int v = dp_pos + a;
            // ทางเลือก 1: ไม่ใช้ absolute
            update(v);
            // ทางเลือก 2: ใช้ absolute (ผลเป็น nonnegative)
            update( (v >= 0 ? v : -v) );
        }
        
        // ลองจาก state ที่เป็นลบ (dp_neg_hi และ dp_neg_lo) หากมี
        if(has_neg) {
            // จาก dp_neg_hi
            {
                int v = dp_neg_hi + a;
                update(v);
                update( (v >= 0 ? v : -v) );
            }
            // จาก dp_neg_lo (ถ้าไม่เท่ากับ dp_neg_hi)
            if(dp_neg_lo != dp_neg_hi) {
                int v = dp_neg_lo + a;
                update(v);
                update( (v >= 0 ? v : -v) );
            }
        }
        
        // อัปเดต state สำหรับขั้นตอนถัดไป
        dp_pos = new_dp_pos;
        has_neg = new_has_neg;
        if(new_has_neg) {
            dp_neg_hi = new_dp_neg_hi;
            dp_neg_lo = new_dp_neg_lo;
        }
    }
    
    // คำตอบคือ dp_pos (state nonnegative ที่ดีที่สุด)
    cout << dp_pos << "\n";
    
    return 0;
}