• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Informatyka-Programowanie

Object Storage Arubacloud
0 głosów
214 wizyt
pytanie zadane 24 marca 2019 w C i C++ przez Lucyfer1234 Początkujący (440 p.)

Witam mam pytanie. Czy ten kod da się jakoś przyśpieszyć?

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
	int l_tulipanow,l_zapytan,tulipanki;
	scanf("%d",&l_tulipanow);
	scanf("%d",&l_zapytan);
	int tab[l_tulipanow];
	for(int tulipanki=0;tulipanki<l_tulipanow;tulipanki++){
		scanf("%d",& tab[tulipanki]);
		
	}
	for(int j=0;j<l_zapytan;j++)
	{
		int a, b , suma=0;
		scanf("%d",&a);
		scanf("%d",&b);
		for(int z=a;z<=b;z++)
		{
			if(tab[z-1] == 1)
			{
				suma++;
			}
		}
		printf("%d\n",suma);
	}
   


return 0;
}
5
komentarz 24 marca 2019 przez adrian17 Ekspert (344,860 p.)
A działa wolno?

Co on ma w ogóle robić?

(i co to za temat pytania? Bo nie rozumiem za bardzo.)

2 odpowiedzi

+1 głos
odpowiedź 24 marca 2019 przez k222 Nałogowiec (30,150 p.)
wybrane 24 marca 2019 przez Lucyfer1234
 
Najlepsza
Tak, da się, algorytmu nie przyspieszysz, bo coś innego niż pętla for zbytnio się nie da wymyślić, to, co możesz ulepszyć to struktura danych.

W twoim programie jest to zwykła tablica i spoko, ale pomyśl sobie co by było jakbyś wsadził tam drzewo binarne. Drzewo bardzo proste: każdy wierzchołek ma indeks początku przedziału, kończ przedziału i sumę czerwonych tulipanów w tym przedziale (oczywiście w korzeniu masz przedział [0, 500000], w jego synach [0,250000], [250000, 500000] i tak malejący o pół).Wysokość takiego drzewa to 19, bo 2^18 < 500000 < 2^19. Żeby obliczyć sumę, musiałbyś najpierw dotrzeć do odpowiednich wierzchołków, dodać z nich wartości i już. Jakbyś miał sumować liczby z przedziału [125000, 350000] to u ciebie trzeba by dodać 225000 liczb, w drzewie wykonać 4 if-y (żeby znaleźć wierzchołki) i dodać wartości w nich zawarte - 5 operacji.

Oczywiście koszt tworzenia takiego drzewa jest niezerowy, ale dla dużej ilości operacji dodawania (szczególnie na dużych przedziałach) zwraca się z nawiązką. Jak przedziały będą wąskie lub operacji będzie mało pętla for będzie szybsza.
0 głosów
odpowiedź 24 marca 2019 przez Lucyfer1234 Początkujący (440 p.)
Zadanie brzmi tak:

Wejście:

W pierwszym wierszu wejścia podawane są dwie liczby całkowite s, z (2 ≤ s, z ≤ 500000), oznaczające odpowiednio liczbę tulipanów oraz liczbę zapytań. W kolejnym wierszu znajduje się sekwencja s cyfr składająca się z 1 i 0, gdzie 1 oznacza czerwonego tulipana, a 0 żółtego. Każda cyfra jest oddzielona od poprzedniej pojedynczą spacją. W kolejnych z wierszach znajdują się dwie liczby całkowite a i b (1≤ a, b ≤ s, a≤b) oznaczające zapytanie o ilość czerwonych tulipanów z przedziału od a do b włącznie.

Wyjście: W każdym i wierszu jedna liczba całkowita równa ilości czerwonych tulipanów z przedziału a i b.

Podobne pytania

–4 głosów
1 odpowiedź 142 wizyt
pytanie zadane 23 października 2020 w C i C++ przez Fuszion74 Początkujący (310 p.)
–1 głos
0 odpowiedzi 197 wizyt
0 głosów
1 odpowiedź 386 wizyt
pytanie zadane 24 marca 2019 w C i C++ przez Lucyfer1234 Początkujący (440 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...