Submission #1339552

#TimeUsernameProblemLanguageResultExecution timeMemory
1339552joze_plocnikBalloons (CEOI11_bal)C++20
20 / 100
152 ms8216 KiB
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <iomanip>
#include <cmath>

#define int long long // vse ti je long long
#define vi vector<int>
#define vvi vector<vi>
#define vpii vector<pair<int,int>>
#define oopt cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
#define forn(i,n) for(int i = 0; i<n; i++)
#define all(x) (x).begin(), (x).end()
#define ld long double

using namespace std;


signed main() {  
    int n; cin >> n;
    vi v(n), mxr(n);
    forn(i,n){
        cin >> v[i] >> mxr[i];
    }
    vi stack; //indexi balonov
    vector<ld> r(n,-1);
    forn(i,n){
        //cout << "smo na indexu: " << i << "\n";
        ld novi_r = 1e9;
        bool first = true;
        while(stack.size()>1-first){
            int id = stack[stack.size()-2+first]; //če prvi, gledamo zadnjega, drugače predzadnjega
            ld mora_r = (v[i]-v[id])*(v[i]-v[id])/(4.0*r[id]);
            if(mora_r < novi_r){ //ljubimo spremembo
                novi_r = mora_r;
                //cout <<"zmanjsa na " << novi_r << "\n";
                if(!first) stack.pop_back();
                if(first) first = false;
            }else{
                break;
            }
        }
        novi_r = min(novi_r, (ld)mxr[i]);
        r[i] = novi_r;
        //faza 2, odstranjevanje neuporabnih
        while(stack.size()>0){
            //najprej odstranimo manjše, nato preverimo special pogoj
            int id = stack.back();
            if(r[id] <= novi_r){ //pogoj za majhnost
                stack.pop_back();
            }else if(stack.size()>1){ //fancy pogoj
                int id0 = stack[stack.size()-2]; //predzadnji element
                int x2 = v[i]-v[id];
                int x1 = v[id]-v[id0];
                int r1 = r[id0], r2 = r[id];
                if(x1*(sqrt(r2)-sqrt(novi_r))<x2*(sqrt(r1)-sqrt(r2))){
                    stack.pop_back();
                }else break;
            }else{
                break; //pred njim ni manjši in pred njim ni fancy pogoja
            }
        }
        stack.push_back(i);
        //cout << "stack zdaj izgleda: ";
        //for(int nekaj : stack) cout << nekaj << " ";
        //cout << "\n";
    }
    forn(i,n){
        cout << fixed << setprecision(3) << r[i] << "\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...