Submission #1193476

#TimeUsernameProblemLanguageResultExecution timeMemory
1193476SSKMFAliens (IOI16_aliens)C++20
4 / 100
1 ms328 KiB
#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;

pair <int64_t , int> minim[100001];
pair < pair <int , int64_t> , int > stiva[100001];

inline long double Intersectie (pair <int , int64_t> &dreapta_1 , pair <int , int64_t> &dreapta_2)
{
    return (long double)(dreapta_2.second - dreapta_1.second) / (dreapta_1.first - dreapta_2.first);
}

inline pair <int64_t , int> Query (const int limita , const int punct)
{
    int stanga = 2 , dreapta = limita;
    while (stanga <= dreapta)
    {
        const int mijloc = (stanga + dreapta) >> 1;
        if (Intersectie(stiva[mijloc].first , stiva[mijloc - 1].first) <= punct)
            { stanga = mijloc + 1; }
        else
            { dreapta = mijloc - 1; }
    }

    return {1LL * stiva[dreapta].first.first * punct + stiva[dreapta].first.second , stiva[dreapta].second};
}

long long take_photos (int dorit , int lungime , int limita , vector <int> linie , vector<int> coloana)
{
    vector < pair <int , int> > sir(dorit + 1);
    for (int indice = 0 ; indice < dorit ; indice++)
    { 
        if (coloana[indice] < linie[indice])
            { swap(linie[indice] , coloana[indice]); }

        sir[indice + 1] = {linie[indice] , coloana[indice]};
    }

    sort(sir.begin() , sir.end());

    int ramas = 1;
    for (int indice = 2 ; indice <= dorit ; indice++)
    {
        if (sir[ramas].first == sir[indice].first)
            { sir[ramas].second = sir[indice].second; }
        else
            if (sir[ramas].second < sir[indice].second)
                { sir[++ramas] = sir[indice]; }
    }

    sir.resize(ramas + 1);
    dorit = ramas;
    limita = min(limita , dorit);

    sir[0] = {-1 , -1};
    int64_t inceput = 0 , sfarsit = 1000000000000LL , rezultat = 0;
    while (inceput <= sfarsit)
    {
        int cantitate = 0;
        const int64_t cost = (inceput + sfarsit) >> 1;
        for (int dreapta = 1 ; dreapta <= dorit ; dreapta++)
        {
            pair < pair <int , int64_t> , int > candidat = {{
                -2 * (sir[dreapta].first - 1) ,
                minim[dreapta - 1].first + 1LL * (sir[dreapta].first - 1) * (sir[dreapta].first - 1) - 1LL * max(0 , sir[dreapta - 1].second - sir[dreapta].first + 1) * max(0 , sir[dreapta - 1].second - sir[dreapta].first + 1)
            } , minim[dreapta - 1].second + 1
            };

            while (cantitate > 1 && (Intersectie(candidat.first , stiva[cantitate - 1].first) < Intersectie(stiva[cantitate - 1].first , stiva[cantitate].first) || (Intersectie(candidat.first , stiva[cantitate - 1].first) == Intersectie(stiva[cantitate - 1].first , stiva[cantitate].first) && candidat.second < stiva[cantitate].second)))
                { cantitate--; }

            stiva[++cantitate] = candidat;

            minim[dreapta] = Query(cantitate , sir[dreapta].second);
            minim[dreapta].first += 1LL * sir[dreapta].second * sir[dreapta].second + cost;
        }
        
        if (minim[dorit].second <= limita) { rezultat = minim[dorit].first - cost * limita; sfarsit = cost - 1; }
        else { inceput = cost + 1; }
    }

    return rezultat;
}

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...