Submission #1092336

#TimeUsernameProblemLanguageResultExecution timeMemory
1092336pudelosTortoise (CEOI21_tortoise)C++17
8 / 100
1 ms452 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define pi pair<int, int>
#define f first
#define s second
#define V vector
const int inf=1e9;
int wyn=0, licznik=0, suma_czasow=0, n;
priority_queue<pi> pq;
void wrzuc(int czas, int ile) {
  if(ile<=0) return;
  suma_czasow+=czas*ile;
  licznik+=ile;
  pq.push({czas, ile});
}
void wywal(int fosy) {
  auto [czas, ile] = pq.top();
  suma_czasow-=czas*ile;
  licznik-=ile;
  pq.pop();
  if(suma_czasow>=fosy) return;
  int ilen = (fosy-suma_czasow)/czas;
  wrzuc(czas, ilen);
}
signed main() {
  cin.tie(0) -> ios_base::sync_with_stdio(0);
  cin >> n;
  V<int> A(n+1), lewo(n+1), prawo(n+1), niezerowy(n+1); 
  FOR(i, 1, n) cin >> A[i];
  int sum=0;
  int idxl=-inf, idxp=inf, idxn=inf;
  FOR(i, 1, n) {
    if(A[i]>0) sum+=A[i];
    lewo[i]=idxl;
    if(A[i]==-1) idxl=i;
  }
  for(int i=n; i>=1; --i) {
    prawo[i]=idxp;
    niezerowy[i]=idxn;
    if(A[i]==-1) idxp=i;
    if(A[i]>0) idxn=i;
  }
  FOR(i, 1, n) {
    if(A[i]<=0) continue;
    int spacer = inf;
    if(niezerowy[i]<=n && prawo[i]<=n) spacer=max(0ll, prawo[i]-niezerowy[i]);
    wrzuc(2*min(prawo[i]-i, i-lewo[i]), A[i]-1);
    wrzuc(2*min({spacer, prawo[i]-i, i-lewo[i]}), 1);
    int fosy=i+2*min({spacer, prawo[i]-i, i-lewo[i]});
    while(suma_czasow>fosy) wywal(fosy);
    wyn=max(wyn, licznik);
  }
  cout << sum-wyn << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...