제출 #1241422

#제출 시각아이디문제언어결과실행 시간메모리
1241422acoatoitgs나일강 (IOI24_nile)C++20
67 / 100
2088 ms12372 KiB
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pi = pair<ll,ll>;

#define all(x) (x).begin(),(x).end()

vector<ll> calculate_costs(vector<int> W, vector<int> A, 
  vector<int> B, vector<int> E) {
  
  int N = (int)W.size();
  int Q = (int)E.size();
  vector<ll> R(Q, 0);
  
  vector<pi> V;
  for(int i = 0; i < N; i++) V.emplace_back(W[i], i);
  sort(all(V));

  for(int q = 0; q < Q; q++)
  {
    ll D = E[q];
    ll ans = 0;

    vector<vector<pi>> groups;

    vector<pi> cur;
    cur.emplace_back(V[0]);
    for(int i = 1; i < N; i++)
    {
      if(V[i].first - cur.back().first <= D)
      {
        cur.emplace_back(V[i]);
      }
      else
      {
        groups.push_back(cur);
        cur = {V[i]};
      }
    }
    groups.push_back(cur);


    for(auto &e : groups)
    {
      int n = e.size();
      if(n%2 == 0)
      {
        for(auto i : e) ans += B[i.second];
        continue;
      }

      ll sum = 0;
      for(auto i : e) sum += B[i.second];
      ll best = LLONG_MAX;

      for(ll i = 0; i < n; i++)
      {
        sum += A[e[i].second]-B[e[i].second];
        if((i%2 == 0 && (n-i-1)%2 == 0) || 
        (i != 0 && i != n-1 && e[i+1].first-e[i-1].first <= D))
        {
          best = min(best, sum);
        }
        sum -= A[e[i].second]-B[e[i].second];
      }
      ans += best;
    }
    R[q] = ans;
  }
  return R;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...