Submission #467329

# Submission time Handle Problem Language Result Execution time Memory
467329 2021-08-22T15:59:43 Z ivan_tudor Holiday (IOI14_holiday) C++14
100 / 100
2179 ms 5752 KB
#include"holiday.h"
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
const int N = 100005;
vector<int> a;
multiset<int> big, small;
long long sum;
int canhold;
int L, R;
void insert_val(int v){
  big.insert(v);
  sum += v;
  while((int)big.size() > max(canhold, 0)){
    int lval = (*big.begin());
    sum -= lval;
    big.erase(big.find(lval));
    small.insert(lval);
  }
}
void erase_val(int v){
  if(small.find(v) != small.end()){
    small.erase(small.find(v));
  }
  else if(big.find(v) != big.end()){
    big.erase(big.find(v));
    sum -= v;
  }

  while((int)big.size() < canhold && small.size() > 0){
    int val = (*small.rbegin());
    big.insert(val);
    sum += val;
    small.erase(small.find(val));
  }
}
void transf(int newL, int newR){
  while(L > newL){
    canhold -=2;
    L--;
    insert_val(a[L]);
  }
  while(R < newR){
    canhold --;
    R++;
    insert_val(a[R]);
  }

  while(L < newL){
    canhold +=2;
    erase_val(a[L]);
    L++;
  }
  while(R > newR){
    canhold++;
    erase_val(a[R]);
    R--;
  }
}
long long ans = 0;
void solve(int l, int r, int opl, int opr){
  if(r < l)
    return;
  int mid = (l + r)/2;
  transf(mid, opl);
  long long maxi = sum;
  int  mpoz = opl;
  for(int i = opl; i <= opr; i++){
    transf(mid, i);
    if(maxi < sum){
      maxi = sum;
      mpoz = i;
    }
  }
  ans = max(ans, maxi);
  if(l == r)
    return;
  if(l <= mid - 1)
    solve(l, mid - 1, opl, mpoz);
  if(mid + 1 <= r)
    solve(mid + 1, r, mpoz, opr);
}
long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
  a = vector<int>(n);
  for(int i = 0; i < n; i++)
    a[i] = attraction[i];

  big.clear();
  small.clear();
  big.insert(a[start]);
  sum = a[start];
  L = R = start;
  canhold = d;
  solve(0, start, start, n - 1);

  reverse(a.begin(), a.end());
  start = n - 1 - start;
  big.clear();
  small.clear();
  big.insert(a[start]);
  sum = a[start];
  L = R = start;
  canhold = d;
  solve(0, start, start, n - 1);
 // cerr<<op;
  return ans;
}
# 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 269 ms 5752 KB Output is correct
2 Correct 290 ms 5708 KB Output is correct
3 Correct 278 ms 5684 KB Output is correct
4 Correct 287 ms 5708 KB Output is correct
5 Correct 438 ms 5316 KB Output is correct
6 Correct 66 ms 1996 KB Output is correct
7 Correct 216 ms 3256 KB Output is correct
8 Correct 261 ms 3736 KB Output is correct
9 Correct 42 ms 1572 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 716 KB Output is correct
2 Correct 4 ms 716 KB Output is correct
3 Correct 4 ms 716 KB Output is correct
4 Correct 25 ms 716 KB Output is correct
5 Correct 21 ms 804 KB Output is correct
6 Correct 4 ms 716 KB Output is correct
7 Correct 7 ms 716 KB Output is correct
8 Correct 7 ms 716 KB Output is correct
9 Correct 7 ms 720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 205 ms 5700 KB Output is correct
2 Correct 228 ms 5720 KB Output is correct
3 Correct 545 ms 2692 KB Output is correct
4 Correct 22 ms 804 KB Output is correct
5 Correct 7 ms 716 KB Output is correct
6 Correct 8 ms 716 KB Output is correct
7 Correct 7 ms 716 KB Output is correct
8 Correct 2179 ms 5228 KB Output is correct
9 Correct 2140 ms 5276 KB Output is correct