Submission

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

Score: 30

User: NJTYTYTY

Problemset: ช่างไฟ

Language: cpp

Time: 0.068 second

Submitted On: 2025-03-21 07:58:04

// #include <iostream>
// #include <vector>
// #include <algorithm>
// using namespace std;
// typedef long long ll;

// int main(){
//     ios::sync_with_stdio(false);
//     cin.tie(nullptr);
    
//     int T;
//     cin >> T;
//     while(T--){
//         int N;
//         cin >> N;
//         vector<ll> L(N);
//         for (int i = 0; i < N; i++){
//             cin >> L[i];
//         }
        
//         // เราจะ binary search หาค่า D ที่มากที่สุด (D = T - 1)
//         // โดยค่า D ต้องเป็น non-negative integer
//         ll lo = 0, hi = 1e10; // กำหนดขอบเขต hi ให้สูงพอ
//         ll best = 0;
//         while(lo <= hi){
//             ll mid = lo + (hi - lo) / 2;
//             __int128 req = 0; // ใช้ __int128 เพื่อป้องกัน overflow
//             for (int i = 0; i < N; i++){
//                 if(mid > L[i] - 1){
//                     req += (mid - (L[i] - 1));
//                     if(req > mid) break; // ไม่ต้องคิดต่อถ้าเกิน
//                 }
//             }
//             if(req <= mid){
//                 best = mid;
//                 lo = mid + 1;
//             } else {
//                 hi = mid - 1;
//             }
//         }
        
//         // ผลลัพธ์ที่ต้องการคือ T = D + 1
//         cout << best + 1 << "\n";
//     }
    
//     return 0;
// }

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

const int NEG_INF = -1e18;  // สำหรับค่า nonnegative ที่ไม่มีผลลัพธ์ที่ดี
const int POS_INF = 1e18;   // สำหรับค่าเริ่มต้นของ state ลบ (เลือกใช้ค่า INF ในการเปรียบเทียบ)

int N;
int a[1000005];  // จัดเก็บค่าที่ต้องซ่อม

// ฟังก์ชัน top-down recursion
// i         : index ของจุดปัจจุบัน (1-based)
// dp_pos    : ค่าสูงสุดใน state nonnegative ที่มีอยู่ ณ จุดนี้
// dp_neg    : ค่าลบ “ลึกสุด” (ต่ำสุด) ที่มีอยู่ ณ จุดนี้
// has_neg   : flag บอกว่ามี state ลบหรือไม่
int rec(int i, int dp_pos, int dp_neg, bool has_neg) {
    if(i > N) {
        // เมื่อผ่านจุดทั้งหมด ผลลัพธ์ที่ดีที่สุดคือใน state nonnegative
        return dp_pos;
    }
    
    // ค่าใหม่สำหรับ state ของขั้นตอนนี้
    int new_dp_pos = NEG_INF;
    int new_dp_neg = POS_INF;
    bool new_has_neg = false;
    
    // จาก state nonnegative (dp_pos) ที่มีอยู่
    if(dp_pos != NEG_INF) {
        int v = dp_pos + a[i];
        // ทางเลือกที่ 1: ไม่ใช้ absolute
        if(v >= 0) {
            new_dp_pos = max(new_dp_pos, v);
        } else {
            new_dp_neg = min(new_dp_neg, v);
            new_has_neg = true;
        }
        // ทางเลือกที่ 2: ใช้ absolute (ผลลัพธ์จะเป็น nonnegativeเสมอ)
        new_dp_pos = max(new_dp_pos, (v >= 0 ? v : -v));
    }
    
    // จาก state ลบ (dp_neg) หากมีอยู่
    if(has_neg) {
        int v = dp_neg + a[i];
        // ทางเลือกที่ 1: ไม่ใช้ absolute
        if(v >= 0) {
            new_dp_pos = max(new_dp_pos, v);
        } else {
            new_dp_neg = min(new_dp_neg, v);
            new_has_neg = true;
        }
        // ทางเลือกที่ 2: ใช้ absolute
        new_dp_pos = max(new_dp_pos, (v >= 0 ? v : -v));
    }
    
    // เรียก recursion สำหรับจุดถัดไป
    return rec(i + 1, new_dp_pos, new_dp_neg, new_has_neg);
}

int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> N;
    for (int i = 1; i <= N; i++){
        cin >> a[i];
    }
    
    // เริ่มต้น state: P = 0 (nonnegative) และยังไม่มี state ลบ
    int ans = rec(1, 0, 0, false);
    cout << ans << "\n";
    
    return 0;
}