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