# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
464349 |
2021-08-13T04:28:19 Z |
blue |
Holiday (IOI14_holiday) |
C++17 |
|
3446 ms |
6384 KB |
#include "holiday.h"
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
const int maxN = 100'000;
int N;
int S;
int D;
vector<long long> A;
long long res = 0;
long long high_sum = 0;
multiset<long long> high_values;
multiset<long long> low_values;
int L;
int R;
int can_visit;
void insert_value(long long V)
{
high_values.insert(V);
high_sum += V;
while((int)(high_values.size()) > max(can_visit, 0))
{
low_values.insert(*high_values.begin());
high_sum -= *high_values.begin();
high_values.erase(high_values.begin());
}
}
void erase_value(long long V)
{
if(low_values.find(V) != low_values.end())
{
low_values.erase(low_values.find(V));
}
else
{
high_values.erase(high_values.find(V));
high_sum -= V;
}
while((int)(high_values.size()) + 1 <= can_visit && (int)((int)(low_values.size())) >= 1)
{
high_values.insert(*low_values.rbegin());
high_sum += *low_values.rbegin();
low_values.erase(low_values.find(*low_values.rbegin()));
}
}
void expand_right()
{
can_visit--;
R++;
insert_value(A[R]);
}
void contract_right()
{
can_visit++;
erase_value(A[R]);
R--;
}
void expand_left()
{
can_visit -= 2;
L--;
insert_value(A[L]);
}
void contract_left()
{
can_visit += 2;
erase_value(A[L]);
L++;
}
void solve(int l1, int l2, int r1, int r2)
{
// cerr << "solve " << l1 << ' ' << l2 << ' ' << r1 << ' ' << r2 << '\n';
int l = (l1+l2)/2;
while(L-1 >= l)
expand_left();
while(R+1 <= max(r1, l))
expand_right();
while(L+1 <= l)
contract_left();
while(R-1 >= max(r1, l))
contract_right();
long long score = high_sum;
int best_r = R;
while(R+1 <= r2)
{
expand_right();
if(high_sum > score)
{
score = high_sum;
best_r = R;
}
// cerr << L << ' ' << R << ' ' << score << '\n';
// cerr << can_visit << '\n';
// for(int a: high_values) cerr << a << ' ';
// cerr << '\n';
// cerr << high_sum << '\n';
// cerr << "\n\n";
}
res = max(res, score);
// cerr << "best_r = " << best_r << '\n';
if(l1 <= l-1)
solve(l1, l-1, r1, best_r);
if(l+1 <= l2)
solve(l+1, l2, best_r, r2);
}
long long int findMaxAttraction(int n, int start, int d, int attraction[])
{
N = n;
S = start;
D = d;
A = vector<long long>(N);
for(int i = 0; i < N; i++) A[i] = attraction[i];
// cerr << "D = " << D << '\n';
if(D == 0) return 0;
//part 1: first left, then right
high_values.insert(A[S]);
high_sum = A[S];
L = R = S;
can_visit = d;
// cerr << "left, then right\n";
// cerr << "S = " << S << '\n';
solve(0, S, 0, N-1);
reverse(A.begin(), A.end());
S = N-1 - S;
high_values.clear();
low_values.clear();
// cerr << "new S = " << S << '\n';
high_values.insert(A[S]);
high_sum = A[S];
L = R = S;
can_visit = d;
// cerr << "right, then left\n";
solve(0, S, 0, N-1);
return res;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
588 KB |
Output is correct |
2 |
Correct |
1 ms |
588 KB |
Output is correct |
3 |
Correct |
1 ms |
588 KB |
Output is correct |
4 |
Correct |
1 ms |
588 KB |
Output is correct |
5 |
Correct |
1 ms |
588 KB |
Output is correct |
6 |
Correct |
1 ms |
588 KB |
Output is correct |
7 |
Correct |
1 ms |
588 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
719 ms |
6112 KB |
Output is correct |
2 |
Correct |
260 ms |
6100 KB |
Output is correct |
3 |
Correct |
761 ms |
6084 KB |
Output is correct |
4 |
Correct |
1078 ms |
6080 KB |
Output is correct |
5 |
Correct |
2049 ms |
5572 KB |
Output is correct |
6 |
Correct |
210 ms |
2124 KB |
Output is correct |
7 |
Correct |
907 ms |
3408 KB |
Output is correct |
8 |
Correct |
1320 ms |
4044 KB |
Output is correct |
9 |
Correct |
160 ms |
1740 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
20 ms |
832 KB |
Output is correct |
2 |
Correct |
9 ms |
844 KB |
Output is correct |
3 |
Correct |
11 ms |
848 KB |
Output is correct |
4 |
Correct |
34 ms |
716 KB |
Output is correct |
5 |
Correct |
28 ms |
800 KB |
Output is correct |
6 |
Correct |
8 ms |
716 KB |
Output is correct |
7 |
Correct |
9 ms |
716 KB |
Output is correct |
8 |
Correct |
13 ms |
728 KB |
Output is correct |
9 |
Correct |
11 ms |
720 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
634 ms |
6116 KB |
Output is correct |
2 |
Correct |
592 ms |
6212 KB |
Output is correct |
3 |
Correct |
750 ms |
2892 KB |
Output is correct |
4 |
Correct |
33 ms |
796 KB |
Output is correct |
5 |
Correct |
9 ms |
716 KB |
Output is correct |
6 |
Correct |
11 ms |
716 KB |
Output is correct |
7 |
Correct |
11 ms |
720 KB |
Output is correct |
8 |
Correct |
3364 ms |
5564 KB |
Output is correct |
9 |
Correct |
3446 ms |
6384 KB |
Output is correct |