Submission #1189231

#TimeUsernameProblemLanguageResultExecution timeMemory
1189231Zakir060Art Exhibition (JOI18_art)C++20
0 / 100
0 ms320 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits> // LLONG_MIN üçün

// Rahatlıq üçün long long təyin edək
using ll = long long;

// Sənət əsərini təsvir edən struktur
struct Artwork {
    int size;
    int value;
};

// Ölçüyə görə müqayisə funksiyası
bool compareArtworks(const Artwork& a, const Artwork& b) {
    return a.size < b.size;
}

int main() {
    // Daha sürətli giriş/çıxış üçün
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int n;
    std::cin >> n;

    std::vector<Artwork> artworks(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> artworks[i].size >> artworks[i].value;
    }

    // Əsərləri ölçülərinə görə çeşidləyirik
    std::sort(artworks.begin(), artworks.end(), compareArtworks);

    // Dəyərlərin (B_i) prefiks cəmlərini hesablayırıq
    std::vector<ll> prefix_value_sum(n + 1, 0);
    for (int i = 0; i < n; ++i) {
        prefix_value_sum[i + 1] = prefix_value_sum[i] + artworks[i].value;
    }

    // Ümumi maksimum məqsəd dəyərini və indiyə qədərki max(A_i - P_i) dəyərini saxlamaq üçün
    ll max_total_objective = LLONG_MIN;
    ll max_prefix_term = LLONG_MIN; // max(A_i - P[i])

    // Çeşidlənmiş əsərlər üzərində dövr edirik.
    // Hər j iterasiyasında, j-ci əsəri potensial A_max olaraq qəbul edirik.
    for (int j = 0; j < n; ++j) {
        // i = j halı üçün (A_i - P_i) terminini hesablayırıq.
        // P[j] = prefix_value_sum[j] = 0-dan j-1-ə qədər dəyərlərin cəmidir.
        ll current_prefix_term = (ll)artworks[j].size - prefix_value_sum[j];

        // İndiyə qədər (i <= j) rast gəlinən ən böyük (A_i - P_i) dəyərini yeniləyirik.
        max_prefix_term = std::max(max_prefix_term, current_prefix_term);

        // Məqsəd funksiyasını (S - A_max + A_min) hesablayırıq.
        // S - A_max + A_min = (P[j+1] - A_j) + (A_i - P_i)
        // Sabit j üçün (P[j+1] - A_j) sabitdir, (A_i - P_i) terminini maksimallaşdırmalıyıq.
        // Bu maksimum dəyər `max_prefix_term`-də saxlanılır.
        ll current_objective = (prefix_value_sum[j + 1] - (ll)artworks[j].size) + max_prefix_term;

        // Bütün mümkün A_max seçimləri arasında tapılan ümumi maksimum məqsəd dəyərini yeniləyirik.
        max_total_objective = std::max(max_total_objective, current_objective);
    }

    // Yekun maksimum dəyəri çap edirik.
    std::cout << max_total_objective << std::endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...