#include <stdio.h> #include <vector> #include <algorithm> struct Client { Client(const long long int count, const long long int time) : m_count(count), m_time(time) {} const long long int m_count; const long long int m_time; }; void readClients(int n, std::vector<Client>& clients) { long long int time, lastTime = -1; int tmpClientsCount = 0; for (int i=0; i<n; ++i) { scanf("%lld", &time); if (time == lastTime) { tmpClientsCount++; } else { if (lastTime != -1) { clients.emplace_back(tmpClientsCount, lastTime); } lastTime = time; tmpClientsCount = 1; } } clients.emplace_back(tmpClientsCount, lastTime); } long long int count(const long long int bakeTime, const std::vector<Client>& clients) { long long int endTime = 0; long long int waitTime = 0; for (const auto client : clients) { const long long int reallyStartTime = std::max(endTime, client.m_time - bakeTime); const long long int beforeStartWaitTime = reallyStartTime + bakeTime - client.m_time; const long long int afterStartWaitTime = ((client.m_count - 1) * client.m_count / 2) * bakeTime; waitTime += beforeStartWaitTime * client.m_count + afterStartWaitTime;; endTime = reallyStartTime + bakeTime * client.m_count; } return waitTime; } int main(int, char **) { int n, m, bakeTime; std::vector<Client> clients; scanf("%d %d", &n, &m); readClients(n, clients); for (int i=0; i<m; ++i) { scanf("%d", &bakeTime); printf("%lld\n", count(bakeTime, clients)); } return 0; }
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 | #include <stdio.h> #include <vector> #include <algorithm> struct Client { Client(const long long int count, const long long int time) : m_count(count), m_time(time) {} const long long int m_count; const long long int m_time; }; void readClients(int n, std::vector<Client>& clients) { long long int time, lastTime = -1; int tmpClientsCount = 0; for (int i=0; i<n; ++i) { scanf("%lld", &time); if (time == lastTime) { tmpClientsCount++; } else { if (lastTime != -1) { clients.emplace_back(tmpClientsCount, lastTime); } lastTime = time; tmpClientsCount = 1; } } clients.emplace_back(tmpClientsCount, lastTime); } long long int count(const long long int bakeTime, const std::vector<Client>& clients) { long long int endTime = 0; long long int waitTime = 0; for (const auto client : clients) { const long long int reallyStartTime = std::max(endTime, client.m_time - bakeTime); const long long int beforeStartWaitTime = reallyStartTime + bakeTime - client.m_time; const long long int afterStartWaitTime = ((client.m_count - 1) * client.m_count / 2) * bakeTime; waitTime += beforeStartWaitTime * client.m_count + afterStartWaitTime;; endTime = reallyStartTime + bakeTime * client.m_count; } return waitTime; } int main(int, char **) { int n, m, bakeTime; std::vector<Client> clients; scanf("%d %d", &n, &m); readClients(n, clients); for (int i=0; i<m; ++i) { scanf("%d", &bakeTime); printf("%lld\n", count(bakeTime, clients)); } return 0; } |