Informatică, întrebare adresată de CiortescuMihai7, 9 ani în urmă

Cerința --> #1512 Mars pbinfo (ajutor am nevoie de 100 pct.)

Se consideră un tablou unidimensional cu n elemente numere întregi, numerotate de la 1 la n, inițial toate nule. Asupra tabloului se fac m operații s d X cu semnificația: toate elementele cu indici cuprinși între s și d își măresc valoare cu X.

Să se afișeze tabloul după realizarea celor m operații.

Date de intrare
Programul citește de la tastatură numerele n m, iar apoi m triplete s d X, cu semnificația din enunț.

Date de ieșire
Programul va afișa pe ecran cele n elemente ale tabloului, separate prin exact un spațiu.

Restricții și precizări
1 ≤ n ≤ 200.000
1 ≤ m ≤ 200.000
1 ≤ s ≤ d ≤ n
-1000 ≤ X ≤ 1000



Exemplu
Intrare:
10 6
8 10 2
3 10 -3
5 9 7
5 5 5
6 7 2
1 1 -1

Ieșire:
-1 0 -3 -3 9 6 6 6 6 -1

Răspunsuri la întrebare

Răspuns de Utilizator anonim
3
#include <iostream>
using namespace std;

int main(){

int n,m,st,dr,X,i;
cout<<"Introduceți lungimea vectorului și numărul de operații: ";
cin>>n>>m;
int v[n+1];
for(i=1;i<=n;i++){
v[i]=0;
}
cout<<"Acum introduceți perechile stânga,dreapta,valoare adițională X\n";
while(m>0){
cin>>st>>dr>>X;
for(i=st;i<=dr;i++){
v[i]=v[i]+X;
}
m--;
}
cout<<"Vectorul după operații:\n";
for(i=1;i<=n;i++){
cout<<v[i]<<" ";
}
return 0;
}

Zlatan: Complexitatea este O(n*m) şi va depăşi limita de timp pe majoritatea testelor.
Utilizator anonim: Am greșit ceva?
Zlatan: Nu. Ceea ce ai scris tu e bine, dar sunt foarte multe actualizări ( m < 200000) si trebuie sa găseşti un algoritm mai eficient.
CiortescuMihai7: Asa este. A depasit limita de timp la 2 teste de 20 de puncte. Am nevoie de un cod mai eficient :)
Zlatan: Declari un vector de lungime n + 1 si procedezi în felul următor : citești st și dr, adică acele capete ale intervalului și scrii v[st] += x; ;i v[dr+1] -= x; La final ( după ce ai facut toate acele operații) faci așa : for(i=1; i<=n; i++) v[i] += v[i-1]; Acesta va fi vectorul rezultat, pe care îl afișezi la final.
Zlatan: st = capătul din stânga, dr = capătul din dreapta și x = valoarea care se adună.
Zlatan: Obții o complexitate de O(n+m), care ar trebui să treacă toate testele.
Alte întrebări interesante