Submission #1285713

#TimeUsernameProblemLanguageResultExecution timeMemory
1285713thanhliem40Balloons (CEOI11_bal)C++20
10 / 100
89 ms9972 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

// Struct lưu thông tin quả bóng đã bơm (Vị trí X, Bán kính R)
struct Balloon {
    ll X;
    double R;
};

// Hàm tính R_i^max khi tiếp xúc với bóng 'prev' (j)
double cal(double R_j, ll X_j, ll X_i) {
    if (R_j < 1e-9) return 1e18; // Rất lớn nếu R_j = 0
    double delta_X = (double)(X_i - X_j);
    return (delta_X * delta_X) / (4.0 * R_j);
}

void sol() {
    ll n;
    cin >> n;
    vector<pair<ll, double>> v(n + 1); // v[i] = {X_i, M_i}
    for (ll i = 1; i <= n; i++) {
        cin >> v[i].first >> v[i].second;
    }

    vector<double> ans(n + 1);
    // Stack lưu các quả bóng đã bơm tạo thành bao lồi dưới
    stack<Balloon> mono_stack;

    for (ll i = 1; i <= n; i++) {
        ll X_i = v[i].first;
        double M_i = v[i].second;

        double R_i = M_i;

        // BƯỚC 1 & 2: Tính R_i và Duy trì Stack
        while (!mono_stack.empty()) {
            Balloon t = mono_stack.top();
            
            // Tính bán kính tối đa R_i khi tiếp xúc với bóng t (j)
            double r_max_t = cal(t.R, t.X, X_i);
            
            // Cập nhật R_i: R_i = min(R_i, r_max_t)
            R_i = min(R_i, r_max_t);
            
            // Nếu r_max_t <= R_i (tức là bóng t GIỚI HẠN R_i)
            if (abs(R_i - r_max_t) < 1e-9 || R_i < r_max_t) {
                // T đã giới hạn R_i, nên không cần kiểm tra bóng dưới T
                break; 
            }
            // Nếu R_i đã được giới hạn bởi M_i hoặc bóng khác (R_i < r_max_t)
            // và r_max_t > R_i: nghĩa là bóng t không phải là giới hạn gần nhất, 
            // ta loại bỏ t để kiểm tra bóng tiếp theo.
            else { 
                mono_stack.pop();
            }
        }
        
        // BƯỚC 3: Thêm bóng i vào Stack
        // Chỉ cần thêm nếu R_i > 0 để tránh R_j = 0
        if (R_i > 1e-9) { 
            mono_stack.push({X_i, R_i});
        }
        ans[i] = R_i;
    }

    // Ghi kết quả
    for (ll i = 1; i <= n; i++) {
        cout << fixed << setprecision(3) << ans[i] << '\n';
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    // freopen("BALLOONS.INP","r",stdin);
    // freopen("BALLOONS.OUT","w",stdout);

    sol();
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...