Submission #1294891

#TimeUsernameProblemLanguageResultExecution timeMemory
1294891KindaGoodGamesBalloons (CEOI11_bal)C++20
10 / 100
1899 ms4428 KiB
#include<bits/stdc++.h>

#define ll long long
#define pii pair<int,double>
#define pdd pair<double,double>
#define tiii tuple<int,int,int>

using namespace std;

double eps = 1e-6;
double round(double var)
{
    // 37.66666 * 100 =3766.66
    // 3766.66 + .5 =3767.16    for rounding off value
    // then type cast to int so value is 3767
    // then divided by 100 so the value converted into 37.67
    double value = (int)(var * 1000 + .5);
    return (double)value / 1000;
}
double dist(pdd a, pdd b){
    double dx = a.first-b.first;
    double dy = a.second-b.second;
    return sqrt((dx*dx)+(dy*dy));
}

double get(pii bal, int p){
    double l = 0;
    double r = 1e9;
    
    pdd point = {bal.first, bal.second};
    double ma = 0;
    while(r-l >= eps){
        double mid = (r+l)/2;
        pdd po = {p,mid};
        
        double d = dist(point, po);
        if(d >= mid+bal.second){
            ma = max(ma, mid);
            l = mid+eps;
        }else{
            r = mid-eps;
        }
    }
    return l;
}

int main(){
    int n;
    cin >> n;

    vector<int> arr(n);
    vector<double> constr(n);

    for(int i = 0; i < n; i++){
        cin >> arr[i] >> constr[i];
    }

    cout << fixed << setprecision(3);

    vector<pii> S;
    for(int i = 0; i < n; i++){
        double val = 2e9;
        int l = 1; int r = S.size()-1;
        while(l < r){
            int mid = (l+r+1)/2;
            double v1 = get(S[mid], arr[i]);
            double v2 = get(S[mid-1], arr[i]);
            val = min({val, v1,v2});
            if(v1-v2 < eps){
                l = mid;
            }else{
                r = mid-1;
            }   
        } 
        if(S.size()) val = min(val, get(S.back(),arr[i]));
        if(S.size()) val = min(val, get(S.front(),arr[i]));
        val = min(val, constr[i]);
        val = round(val);
        while(S.size() && S.back().second <= val){
            S.pop_back();
        }
        S.push_back({arr[i],val});
        cout << val << "\n";
    }
    
}
#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...