Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> using namespace std; #pragma warning (disable : 4996) struct event_point { long long day_cut; long long height_cut; int idx_first_affected; event_point(long long d_, long long h_, int i_) : day_cut(d_), height_cut(h_), idx_first_affected(i_) { } ; }; long long long_long_ceil(long long a, long long b) { return (a+b-1LL) / b; } int main(int argc, char* argv[]) { #ifdef _DEBUG freopen("input.txt.extreme_strange_extention", "rt", stdin); freopen("output.txt.extreme_strange_extention", "wt", stdout); #endif int N, M; scanf("%d %d", &N, &M); // cin >> N >> M; vector<int> speeds(N); for(int i=0; i<N; i++) // cin >> speeds[i]; scanf("%d", &(speeds[i])); sort(speeds.begin(), speeds.end()); vector<long long> speed_sums_till_end(N); speed_sums_till_end.back() = (long long)speeds.back(); for(int i = (int)(speeds.size())-2; i>=0; i--) speed_sums_till_end[i] = speed_sums_till_end[i+1] + speeds[i]; speed_sums_till_end.push_back(0LL); vector<event_point> actual_cuts; actual_cuts.push_back(event_point(0LL, 0LL, 0)); long long curr_level; long long curr_day; long long total_sum_before = 0LL; for(int k=0; k<M; k++) { // cin >> curr_day >> curr_level; #ifdef _DEBUG scanf("%I64d %I64d", &curr_day, &curr_level); #else scanf("%lld %lld", &curr_day, &curr_level); #endif long long curr_res = 0LL; int prev_idx = speeds.size(); while(!actual_cuts.empty() && actual_cuts.back().height_cut + (curr_day-actual_cuts.back().day_cut) * speeds[actual_cuts.back().idx_first_affected] > curr_level) { long long factor1_1 = (speed_sums_till_end[actual_cuts.back().idx_first_affected] - speed_sums_till_end[prev_idx]); long long factor1_2 = (curr_day - actual_cuts.back().day_cut); long long factor2_1 = (actual_cuts.back().height_cut - curr_level); long long factor2_2 = (prev_idx - actual_cuts.back().idx_first_affected); long long add1 = factor1_1 * factor1_2; long long add2 = factor2_1 * factor2_2; curr_res += add1 + add2; prev_idx = actual_cuts.back().idx_first_affected; actual_cuts.pop_back(); } if(actual_cuts.empty()) { actual_cuts.push_back(event_point(curr_day, curr_level, 0)); } else { int curr_idx = upper_bound( speeds.begin() + actual_cuts.back().idx_first_affected, speeds.begin() + prev_idx, (curr_level - actual_cuts.back().height_cut) / (curr_day - actual_cuts.back().day_cut) // long_long_ceil((curr_level - actual_cuts.back().height_cut) , (curr_day - actual_cuts.back().day_cut)) ) - speeds.begin(); long long factor1_1 = (speed_sums_till_end[curr_idx] - speed_sums_till_end[prev_idx]); long long factor1_2 = (curr_day - actual_cuts.back().day_cut); long long factor2_1 = (actual_cuts.back().height_cut - curr_level); long long factor2_2 = (prev_idx - curr_idx); long long add1 = factor1_1 * factor1_2; long long add2 = factor2_1 * factor2_2; curr_res += add1 + add2; if(curr_idx == actual_cuts.back().idx_first_affected) { actual_cuts.back().day_cut = curr_day; actual_cuts.back().height_cut = curr_level; } else { // curr_idx > actual_cuts.back().idx_first_affected, �� ��������� if(curr_idx < N) actual_cuts.push_back(event_point(curr_day, curr_level, curr_idx)); } } // cout << curr_res << "\n"; #ifdef _DEBUG printf("%I64d\n", curr_res); #else printf("%lld\n", curr_res); #endif } 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 | #include <cstdio> #include <iostream> #include <vector> #include <algorithm> using namespace std; #pragma warning (disable : 4996) struct event_point { long long day_cut; long long height_cut; int idx_first_affected; event_point(long long d_, long long h_, int i_) : day_cut(d_), height_cut(h_), idx_first_affected(i_) { } ; }; long long long_long_ceil(long long a, long long b) { return (a+b-1LL) / b; } int main(int argc, char* argv[]) { #ifdef _DEBUG freopen("input.txt.extreme_strange_extention", "rt", stdin); freopen("output.txt.extreme_strange_extention", "wt", stdout); #endif int N, M; scanf("%d %d", &N, &M); // cin >> N >> M; vector<int> speeds(N); for(int i=0; i<N; i++) // cin >> speeds[i]; scanf("%d", &(speeds[i])); sort(speeds.begin(), speeds.end()); vector<long long> speed_sums_till_end(N); speed_sums_till_end.back() = (long long)speeds.back(); for(int i = (int)(speeds.size())-2; i>=0; i--) speed_sums_till_end[i] = speed_sums_till_end[i+1] + speeds[i]; speed_sums_till_end.push_back(0LL); vector<event_point> actual_cuts; actual_cuts.push_back(event_point(0LL, 0LL, 0)); long long curr_level; long long curr_day; long long total_sum_before = 0LL; for(int k=0; k<M; k++) { // cin >> curr_day >> curr_level; #ifdef _DEBUG scanf("%I64d %I64d", &curr_day, &curr_level); #else scanf("%lld %lld", &curr_day, &curr_level); #endif long long curr_res = 0LL; int prev_idx = speeds.size(); while(!actual_cuts.empty() && actual_cuts.back().height_cut + (curr_day-actual_cuts.back().day_cut) * speeds[actual_cuts.back().idx_first_affected] > curr_level) { long long factor1_1 = (speed_sums_till_end[actual_cuts.back().idx_first_affected] - speed_sums_till_end[prev_idx]); long long factor1_2 = (curr_day - actual_cuts.back().day_cut); long long factor2_1 = (actual_cuts.back().height_cut - curr_level); long long factor2_2 = (prev_idx - actual_cuts.back().idx_first_affected); long long add1 = factor1_1 * factor1_2; long long add2 = factor2_1 * factor2_2; curr_res += add1 + add2; prev_idx = actual_cuts.back().idx_first_affected; actual_cuts.pop_back(); } if(actual_cuts.empty()) { actual_cuts.push_back(event_point(curr_day, curr_level, 0)); } else { int curr_idx = upper_bound( speeds.begin() + actual_cuts.back().idx_first_affected, speeds.begin() + prev_idx, (curr_level - actual_cuts.back().height_cut) / (curr_day - actual_cuts.back().day_cut) // long_long_ceil((curr_level - actual_cuts.back().height_cut) , (curr_day - actual_cuts.back().day_cut)) ) - speeds.begin(); long long factor1_1 = (speed_sums_till_end[curr_idx] - speed_sums_till_end[prev_idx]); long long factor1_2 = (curr_day - actual_cuts.back().day_cut); long long factor2_1 = (actual_cuts.back().height_cut - curr_level); long long factor2_2 = (prev_idx - curr_idx); long long add1 = factor1_1 * factor1_2; long long add2 = factor2_1 * factor2_2; curr_res += add1 + add2; if(curr_idx == actual_cuts.back().idx_first_affected) { actual_cuts.back().day_cut = curr_day; actual_cuts.back().height_cut = curr_level; } else { // curr_idx > actual_cuts.back().idx_first_affected, �� ��������� if(curr_idx < N) actual_cuts.push_back(event_point(curr_day, curr_level, curr_idx)); } } // cout << curr_res << "\n"; #ifdef _DEBUG printf("%I64d\n", curr_res); #else printf("%lld\n", curr_res); #endif } return 0; } |