#include <iostream> #include <sstream> using namespace std; typedef unsigned long long ull; const int MAX_CLI = 200 * 1024; struct input_t { int cli_num; ull cli_time[MAX_CLI]; int oven_num; unsigned oven_time[MAX_CLI]; } in; struct queue_t { int b; int e; int cli_num[MAX_CLI]; unsigned time_left[MAX_CLI]; inline void clear() { b = e = 0; } inline void push_back(int cli, unsigned time) { cli_num[e] = cli; time_left[e] = time; ++e; } inline bool empty() { return b == e; } inline int size() { return b - e; } inline int front_num() { return cli_num[b]; } inline unsigned& front_time() { return time_left[b]; } inline void pop_front() { ++b; } } que; void read() { cin >> in.cli_num >> in.oven_num; for (int i = 0; i < in.cli_num; ++i) { cin >> in.cli_time[i]; } for (int i = 0; i < in.oven_num; ++i) { cin >> in.oven_time[i]; } } void clean() { que.clear(); } void solve(int tc) { ull res = 0; ull last_time = 0; ull available_time; for (int i = 0; i < in.cli_num; ++i) { while (!que.empty()) { // cout << in.cli_time[i] << " " << last_time << endl; available_time = in.cli_time[i] - last_time; if (available_time > 0) { if (available_time >= que.front_time()) { last_time += que.front_time(); res += last_time - in.cli_time[que.front_num()]; // cout << "current_time: " << last_time << ", client: " << que.front_num() << ", serve time: " << last_time - in.cli_time[que.front_num()] << ", total_res: " << res << endl; que.pop_front(); } else { que.front_time() -= available_time; last_time = in.cli_time[i]; break; } } else { break; } } available_time = in.cli_time[i] - last_time; // cout << "i: " << i << ", in.cli_time[i]: " << in.cli_time[i] << ", last_time: " << last_time << endl; if(available_time < in.oven_time[tc]){ // cout << "push: " << i << ", time: "<< in.oven_time[tc] - available_time << endl; que.push_back(i, in.oven_time[tc] - available_time); } last_time = in.cli_time[i]; } while (!que.empty()) { last_time += que.front_time(); res += last_time - in.cli_time[que.front_num()]; // cout << "current_time: " << last_time << ", client: " << que.front_num() << ", serve time: " << last_time - in.cli_time[que.front_num()] << ", total_res: " << res << endl; que.pop_front(); } cout << res << endl; } int main() { ios_base::sync_with_stdio(0); read(); for (int i = 0; i < in.oven_num; ++i) { clean(); solve(i); } 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 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 108 109 110 111 112 113 114 115 116 117 | #include <iostream> #include <sstream> using namespace std; typedef unsigned long long ull; const int MAX_CLI = 200 * 1024; struct input_t { int cli_num; ull cli_time[MAX_CLI]; int oven_num; unsigned oven_time[MAX_CLI]; } in; struct queue_t { int b; int e; int cli_num[MAX_CLI]; unsigned time_left[MAX_CLI]; inline void clear() { b = e = 0; } inline void push_back(int cli, unsigned time) { cli_num[e] = cli; time_left[e] = time; ++e; } inline bool empty() { return b == e; } inline int size() { return b - e; } inline int front_num() { return cli_num[b]; } inline unsigned& front_time() { return time_left[b]; } inline void pop_front() { ++b; } } que; void read() { cin >> in.cli_num >> in.oven_num; for (int i = 0; i < in.cli_num; ++i) { cin >> in.cli_time[i]; } for (int i = 0; i < in.oven_num; ++i) { cin >> in.oven_time[i]; } } void clean() { que.clear(); } void solve(int tc) { ull res = 0; ull last_time = 0; ull available_time; for (int i = 0; i < in.cli_num; ++i) { while (!que.empty()) { // cout << in.cli_time[i] << " " << last_time << endl; available_time = in.cli_time[i] - last_time; if (available_time > 0) { if (available_time >= que.front_time()) { last_time += que.front_time(); res += last_time - in.cli_time[que.front_num()]; // cout << "current_time: " << last_time << ", client: " << que.front_num() << ", serve time: " << last_time - in.cli_time[que.front_num()] << ", total_res: " << res << endl; que.pop_front(); } else { que.front_time() -= available_time; last_time = in.cli_time[i]; break; } } else { break; } } available_time = in.cli_time[i] - last_time; // cout << "i: " << i << ", in.cli_time[i]: " << in.cli_time[i] << ", last_time: " << last_time << endl; if(available_time < in.oven_time[tc]){ // cout << "push: " << i << ", time: "<< in.oven_time[tc] - available_time << endl; que.push_back(i, in.oven_time[tc] - available_time); } last_time = in.cli_time[i]; } while (!que.empty()) { last_time += que.front_time(); res += last_time - in.cli_time[que.front_num()]; // cout << "current_time: " << last_time << ", client: " << que.front_num() << ", serve time: " << last_time - in.cli_time[que.front_num()] << ", total_res: " << res << endl; que.pop_front(); } cout << res << endl; } int main() { ios_base::sync_with_stdio(0); read(); for (int i = 0; i < in.oven_num; ++i) { clean(); solve(i); } return 0; } |