// 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; } |
English