// ConsoleApplication4.cpp : Defines the entry point for the console application. // //#include "stdafx.h" #include <string> #include <iostream> using namespace std; void WzrostPola(unsigned long long int); unsigned long long int KoszeniePola(unsigned long long int); //zmienne unsigned long int n, m; unsigned long long int d[2], b[2]; // !! string LiniaDanych; string::size_type sz = 0; unsigned long long int * wzrost = NULL; unsigned long long int * pole = NULL; int main() { cin >> n >> m; // N M 500 000 cin.get(); // wyczyszczenie strumienia z enter wzrost = new unsigned long long int[n]; // stworzenie dynamicznej tablicy pole = new unsigned long long int[n]; d[0] = d[1] = 0; // zerowanie wartosci b[0] = b[1] = 0; getline(cin, LiniaDanych); // Pobranie ciągu 10^6 int l = 0; // na potrzeby kopiowania danych for (int i = 0; i < n; i++) { pole[i] = 0; // Pole jest na poziomie 0 wzrost[i] = stoull(LiniaDanych, &sz, 0); // Ustawienie wzrostu LiniaDanych = LiniaDanych.substr(sz); // kasacja liczby } for (int i = 0; i < m; i++) { cin >> d[0] >> b[0]; // dzien i wysokosc cin.get(); // czyszczenie strumienia WzrostPola( d[0] - d[1] ); // d[0]-d[1] - ile dni d[1] = d[0]; // ZapiszDzien cout << KoszeniePola(b[0]) << endl; } delete[] wzrost; delete[] pole; return 0; } /* void ZapiszDzien(int x) { d[1] = x; } int IleDni(int x) { return (x - d[1]); // jesli czas pomiedzy skoszeniami byl dluzszy niz 1 dzien } */ void WzrostPola(unsigned long long int IleDni) { if (IleDni > 1) // Zalozenie ze nie bedzie zera { for (int i = 0; i < n; i++) pole[i] += (IleDni * wzrost[i]); } else { for (int i = 0; i < n; i++) // Blok jest identyczny, napisany by uniknac mnozenia przez 1 za kazdym razem pole[i] += wzrost[i]; } } unsigned long long int KoszeniePola(unsigned long long int wysokosc) { unsigned long long int tmp = 0; unsigned long long int suma = 0; for (int i = 0; i < n; i++) { if (pole[i] > wysokosc) { tmp = (pole[i] - wysokosc); pole[i] -= tmp; suma += tmp; // sprawdzamy ile zostalo skoszone } } return suma; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | // ConsoleApplication4.cpp : Defines the entry point for the console application. // //#include "stdafx.h" #include <string> #include <iostream> using namespace std; void WzrostPola(unsigned long long int); unsigned long long int KoszeniePola(unsigned long long int); //zmienne unsigned long int n, m; unsigned long long int d[2], b[2]; // !! string LiniaDanych; string::size_type sz = 0; unsigned long long int * wzrost = NULL; unsigned long long int * pole = NULL; int main() { cin >> n >> m; // N M 500 000 cin.get(); // wyczyszczenie strumienia z enter wzrost = new unsigned long long int[n]; // stworzenie dynamicznej tablicy pole = new unsigned long long int[n]; d[0] = d[1] = 0; // zerowanie wartosci b[0] = b[1] = 0; getline(cin, LiniaDanych); // Pobranie ciągu 10^6 int l = 0; // na potrzeby kopiowania danych for (int i = 0; i < n; i++) { pole[i] = 0; // Pole jest na poziomie 0 wzrost[i] = stoull(LiniaDanych, &sz, 0); // Ustawienie wzrostu LiniaDanych = LiniaDanych.substr(sz); // kasacja liczby } for (int i = 0; i < m; i++) { cin >> d[0] >> b[0]; // dzien i wysokosc cin.get(); // czyszczenie strumienia WzrostPola( d[0] - d[1] ); // d[0]-d[1] - ile dni d[1] = d[0]; // ZapiszDzien cout << KoszeniePola(b[0]) << endl; } delete[] wzrost; delete[] pole; return 0; } /* void ZapiszDzien(int x) { d[1] = x; } int IleDni(int x) { return (x - d[1]); // jesli czas pomiedzy skoszeniami byl dluzszy niz 1 dzien } */ void WzrostPola(unsigned long long int IleDni) { if (IleDni > 1) // Zalozenie ze nie bedzie zera { for (int i = 0; i < n; i++) pole[i] += (IleDni * wzrost[i]); } else { for (int i = 0; i < n; i++) // Blok jest identyczny, napisany by uniknac mnozenia przez 1 za kazdym razem pole[i] += wzrost[i]; } } unsigned long long int KoszeniePola(unsigned long long int wysokosc) { unsigned long long int tmp = 0; unsigned long long int suma = 0; for (int i = 0; i < n; i++) { if (pole[i] > wysokosc) { tmp = (pole[i] - wysokosc); pole[i] -= tmp; suma += tmp; // sprawdzamy ile zostalo skoszone } } return suma; } |