tactica

Time limit: 0.2s Memory limit: 64MB Input: tactica.in Output: tactica.out

Pentru a fi cât mai eficienți în blocarea atacurilor echipei adverse, antrenorul și-a instruit cei NN jucători să se regrupeze într-o zonă de teren, de lungime exact LL. Considerăm că terenul de joc este axa OxOx, iar poziția curentă a fiecărui jucător este un număr natural. Considerăm, în plus, că jucătorii sunt numerotați de la 11 la NN, în ordinea crescătoare a pozițiilor lor pe axa OxOx.

Costul deplasării unui jucător ii (1iN1 \leq i \leq N) de la poziția sa xix_i la o poziție yy este xiy|x_i - y|. Costul regrupării este suma costurilor deplasărilor tuturor jucătorilor. La finalul regrupării, distanța dintre cel mai din stânga și cel mai din dreapta jucător din zonă trebuie să fie exact LL.

Cerință

Să se determine costul minim posibil al unei regrupări.

Interacțiune

Programul nu va citi date de la intrare și nu va face afișări. Concurentul trebuie să implementeze funcția:

long long solve(int N, int L);

Funcția primește ca parametri valorile lui NN și LL și trebuie să returneze costul total minim cu care toți cei NN jucători pot fi aduși în aceeași zonă compactă de lungime exact LL.

Funcția solve() poate apela următoarele funcții:

  • int getX(int i) - returnează poziția la care se află inițial jucătorul ii
  • int getNumber(int x1, int x2); returnează numărul de jucători care au poziția cuprinsă în intervalul de valori [x1,x2][x_1, x_2]
  • long long getSumX(int x1, int x2); returnează suma pozițiilor jucătorilor care au poziția cuprinsă în intervalul de valori [x1,x2][x_1, x_2]

Concurentul va trebui să trimită un fișier cu structura:

#include "problem.h"

long long solve(int N, int L) {
    ...
}

Restricții și precizări

  • 2N1062 \leq N \leq 10^6
  • 1L1091 \leq L \leq 10^9
  • 1xi1091 \leq x_i \leq 10^9, pentru 1iN1 \leq i \leq N
  • Pozițiile inițiale ale jucătorilor sunt distincte, dar în zona de lungime LL este permis să ajungă doi sau mai mulți jucători în aceeași poziție.
# Punctaj Restricții
1 8 xNx1Lx_N - x_1 \leq L, N100N \geq 100
2 23 N<100N < 100
3 69 Fără restricții suplimentare.

Modalitate de punctare

Notăm cu AA numărul total cumulat de apeluri ale funcțiilor de mai sus.

  • dacă A100A \leq 100 se obține întreg punctajul pentru acel test;
  • altfel dacă A150A \leq 150 se obține 0.80.8 din punctajul alocat acelui test;
  • altfel dacă A250A \leq 250 se obține 0.60.6 din punctajul alocat acelui test;
  • altfel dacă A400A \leq 400 se obține 0.40.4 din punctajul alocat acelui test;
  • altfel, punctajul acordat pe acel test va fi 00.

Testare locală

Pentru testare locală puteți folosi următoarele fișiere listate la atașamente:

  • grader.cpp
  • problem.h

Exemplu

Presupunem că N=3N = 3, L=4L = 4, x1=2x_1 = 2, x2=7x_2 = 7 și x3=13x_3 = 13. Atunci un comportament posibil al soluției este:

  • getX(1); va returna 22;
  • getX(2); va returna 77;
  • getX(3); va returna 1313;
  • Una dintre regrupările optime este în fereastra [5,9][5, 9]. Jucătorul 11 se deplasează la poziția 55 (cost 33), jucătorul 22 stă pe loc (cost 00), iar jucătorul 33 se deplasează la poziția 99 (cost 44).
  • Costul regrupării este 77, deci funcția va returna 77.

O versiune de program ar putea fi:

#include "problem.h"

long long solve(int N, int L) {
    int x1 = getX(1); // va returna 2
    int x2 = getX(2); // va returna 7
    int x3 = getX(3); // va returna 13
    long long res = /* calculele voastre aici */;
    return res;
}

Log in or sign up to be able to send submissions!