Submission #1316701

#TimeUsernameProblemLanguageResultExecution timeMemory
1316701tkhoi13Hacker (BOI15_hac)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>
#define ll long long
#define FOR(i, a, b) for (int i = a, _b = (b); i <= _b; ++i)
#define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i)
#define all(x) begin(x), end(x)
#define endl '\n'

using namespace std;

const int MAX = 1e6 + 5; // Tăng lên gấp đôi vì mình sẽ nhân đôi mảng
int n;
int a[MAX];     // Input ban đầu
ll sum[MAX];    // Mảng tổng cửa sổ trượt (Prefix sum cũng được)

void solve() {
    // 1. Nhân đôi mảng để xử lý vòng tròn dễ hơn
    // a[0]...a[n-1] -> a[0]...a[2n-1]
    for(int i = 0; i < n; ++i) a[i + n] = a[i];

    // Độ dài cửa sổ mà Hacker tác động (thường là N/2)
    int window = (n + 1) / 2; 
    
    // 2. Tính tổng của mọi cửa sổ độ dài `window`
    // s là biến cộng dồn tạm thời
    ll s = 0;
    // Tính cửa sổ đầu tiên [0...window-1]
    for(int i = 0; i < window; ++i) s += a[i];
    sum[0] = s;

    // Tính các cửa sổ tiếp theo bằng Sliding Window O(N)
    // sum[i] là tổng của đoạn bắt đầu từ i: a[i]...a[i+window-1]
    for(int i = 1; i < 2 * n; ++i) {
        s -= a[i - 1];          // Bỏ phần tử cũ
        if (i + window - 1 < 2 * n) // Kiểm tra biên
            s += a[i + window - 1]; // Thêm phần tử mới
        sum[i] = s;
    }

    // 3. Dùng Deque tìm Min/Max tùy theo đề bài
    // Giả sử logic của bạn là: Tìm max của (min các cửa sổ sum trong phạm vi nào đó)
    // Code dưới đây giữ nguyên logic logic "Max of Mins" của bạn
    
    deque<int> q; // Lưu chỉ số
    vector<ll> b(n * 2, -1e18); // Lưu kết quả

    // Cần xác định rõ phạm vi sliding window của bước 2
    // Ví dụ: Với mỗi vị trí i, xét các đoạn sum trong khoảng [i, i + k...]
    // Ở đây mình minh họa khung sườn, bạn lắp logic phạm vi vào nhé
    
    /* LƯU Ý: Đoạn logic dưới này phụ thuộc vào việc Hacker xóa đoạn nào.
       Nếu Hacker xóa đoạn độ dài L bắt đầu tại j sao cho i thuộc đoạn đó?
       Hay Hacker xóa đoạn bất kỳ? 
       Thường bài này là: 
       Total_Sum - (Max sum đoạn con độ dài L).
       Nhưng nếu code bạn dùng queue để tìm min/max cục bộ thì áp dụng vào đây.
    */

    // Demo Logic Deque chuẩn:
    int query_range = n - window + 1; // Ví dụ độ dài phạm vi query
    for (int i = 0; i < n * 2; ++i) {
        // 1. Pop phần tử quá hạn ra khỏi đầu hàng đợi
        if (!q.empty() && q.front() < i - query_range + 1) q.pop_front();

        // 2. Duy trì tính đơn điệu (Giả sử tìm MIN thì pop các thằng LỚN hơn)
        while (!q.empty() && sum[q.back()] >= sum[i]) q.pop_back();

        // 3. Push hiện tại vào
        q.push_back(i);

        // 4. Lấy kết quả (Min trong cửa sổ hiện tại)
        if (i >= query_range - 1) {
            // sum[q.front()] chính là min sum trong phạm vi
            // logic của bạn ở đây...
        }
    }
}

void input() {
    cin >> n;
    REP(i, n) cin >> a[i];
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    // openFile("hacker"); // Nếu nộp bài cần file
    input();
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...