Submission #1349222

#TimeUsernameProblemLanguageResultExecution timeMemory
1349222SSKMFPairs (IOI07_pairs)C++20
60 / 100
19 ms1732 KiB
#include <bits/stdc++.h>
using namespace std;

void Solve1 ()
{
    int cantitate , limita , lungime;
    cin >> cantitate >> limita >> lungime;

    vector <int> sir(cantitate);
    for (auto& locatie : sir)
        { cin >> locatie; }

    sort(sir.begin() , sir.end());
        
    int64_t modalitati = 0;
    for (int stanga = 0 , dreapta = 0 ; dreapta < cantitate ; dreapta++)
    {
        while (sir[dreapta] - sir[stanga] > limita)
            { stanga++; }

        modalitati += dreapta - stanga;
    }

    cout << modalitati;
}

int arbore[150000];

void Update (int indice , const int termen , const int lungime)
{
    for ( ; indice <= lungime ; indice += (indice & -indice))
        { arbore[indice] += termen; }
}

int Query (int stanga , int dreapta)
{
    stanga--;
    int rezultat = 0;
    while (stanga != dreapta) {
        if (stanga < dreapta) { rezultat += arbore[dreapta]; dreapta ^= (dreapta & -dreapta); }
        else { rezultat -= arbore[stanga]; stanga ^= (stanga & -stanga); }
    }

    return rezultat;
}

void Solve2 ()
{
    int cantitate , limita , lungime;
    cin >> cantitate >> limita >> lungime;

    vector < pair <int , int> > sir(cantitate);
    for (auto& locatie : sir)
    { 
        cin >> locatie.first >> locatie.second;
        
        locatie = {locatie.first + locatie.second - 1 , locatie.first - locatie.second + lungime};
    }

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

    (lungime <<= 1)--;
    int64_t modalitati = 0;
    for (int stanga = 0 , dreapta = 0 ; dreapta < cantitate ; dreapta++)
    {
        while (sir[dreapta].first - sir[stanga].first > limita)
            { Update(sir[stanga].second , -1 , lungime); stanga++; }
            
        modalitati += Query(max(1 , sir[dreapta].second - limita) , min(lungime , sir[dreapta].second + limita));
        Update(sir[dreapta].second , 1 , lungime);
    }

    cout << modalitati;
}

void Solve3 ()
{
  cout << '1';
}

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int cerinta;
    cin >> cerinta;

    if (cerinta == 1) { Solve1(); }
    else if (cerinta == 2) { Solve2(); }
    else { Solve3(); }
    
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...