Informatică, întrebare adresată de printess199, 8 ani în urmă

1102 PBINFO
Pe o masă cad n bile săltăreţe. Fiecare este lăsată să cadă liber de la o înălţime h, diferită pentru fiecare bilă. Toate bilele cad simultan, cu o viteză constantă (1m/s) .

În momentul în care bila i atinge masa, tendinţa ei va fi să se ridice în aer până la înălţimea h - k, după care aceasta cade din nou. De fiecare dată când o bilă atinge masa, aceasta va tinde să urce la o înlăţime cu k mai mică decât cea la care a urcat anterior. Dupa multe sărituri, bilele pot obosi şi nu vor mai sări. Când bilele sar în sus, vor urca tot cu aceeaşi viteza constantă.

Dându-se h şi k pentru fiecare dintre cele n bile, să se răspundă la m întrebări de forma: La ce înălţime faţă de masă se va afla bila x în momentul t ?

Date de intrare
Fişierul de intrare bile2.in conţine pe prima linie 2 numere naturale n şi m. Pe următoarele n linii se află o pereche de numere, h şi k . Următoarele m linii vor conţine 2 numere naturale x şi t cu semnificaţiile de mai sus.

Date de ieşire
În fişierul de ieşire bile2.out se vor afişa m linii, răspunsurile la cele m întrebări.

Restricţii
1 ≤ n, m ≤ 100.000
1 ≤ h, k ≤ 1.000.000.000
1 ≤ t ≤ 2.000.000.000
0 < x ≤ n



Exemplu
bile2.in

2 3
5 1
8 2
1 4
1 7
2 16
bile2.out

1
2
4
Explicaţie
Bila 1 cade de la înălţimea 5 timp de 4 secunde apoi se opreşte la înălţimea 1.

Bila 1 cade de la înălţimea 5 şi atinge pământul, iar în cele 2 secunde rămase ajunge la înălţimea 2.

Bila 2 cade de la înălţimea 8, atinge pământul şi apoi ajunge la noua sa înălţime maximă, 6, în 14 secunde. în cele 2 secunde rămase, bila apucă să coboare la înălţimea 4.


lucaciucandrei: cum te numesti pe pbinfo?

Răspunsuri la întrebare

Răspuns de lucaciucandrei
4

#include <fstream>  

using namespace std;  

ifstream fin("bile2.in");

ofstream fout("bile2.out");  

const int N = 1e5 + 5;  

long long h[N], k[N], n, m, x, t;  

#define max(x, y)((x) < (y) ? (y) : (x))  

int main() {

   fin >> n >> m;

   for (int i = 1; i <= n; ++i)

       fin >> h[i] >> k[i];

   for (int i = 0; i < m; ++i) {

       fin >> x >> t;

       int crt = h[x], height = h[x];

       if (t <= h[x]) {

           fout << h[x] - t << "n";

           continue;

       }

       t -= h[x];

       height = 0;

       crt -= k[x];

       while (t && crt) {

           if (t <= crt) {

               height += t;

               t = 0;

           } else {

               t -= crt;

               height = crt;

           }

           if (!t)

               break;

           if (t <= crt) {

               height -= t;

               t = 0;

           } else {

               t -= crt;

               height = 0;

           }

           crt = max(0, crt - k[x]);

       }

       fout << height << "n";

   }

}

Alte întrebări interesante