Submission #1211748

#TimeUsernameProblemLanguageResultExecution timeMemory
1211748Adomas08Nile (IOI24_nile)C++20
17 / 100
2095 ms13440 KiB
#include "nile.h"
#include <bits/stdc++.h>

using namespace std;

std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A,
                                       std::vector<int> B, std::vector<int> E) {
  int Q = (int)E.size(), n = (int)A.size();
  long long sum = 0, diff, diffe = 0;
  std::vector<long long> R(Q, 0);
  vector <pair<int, int>> F;
  for (int i = 0; i < Q; i++){
    F.push_back({E[i], i});
  }
  vector <long long> diffs;
  sort(F.begin(), F.end());
  vector <pair<int, long long>> C;
  for (int i = 0; i < A.size(); i++){
    C.push_back({W[i], A[i] - B[i]});
    diff = B[i];
    sum += diff;
  }
  sort(C.begin(), C.end());
  vector <pair<long long, pair<int, int>>> costs;
  for (int i = 0; i < n - 1; i++){
     costs.push_back({C[i+1].first - C[i].first, {i, i + 1}});
     if (i < n - 2) costs.push_back({C[i+2].first - C[i].first, {i, i + 2}});
  }
  sort(costs.begin(), costs.end());
  vector <pair<int, int>> segments;
  vector<long long> mino, mine, mins;
  for (int i = 0; i < n; i++){
    segments.push_back({i, i});
    diffs.push_back(C[i].second);
    diffe += C[i].second;
    if (i % 2 == 0){
        mine.push_back(C[i].second);
        mino.push_back(INT_MAX);
        mins.push_back(INT_MAX);
    }
    else{
        mino.push_back(C[i].second);
        mine.push_back(INT_MAX);
        mins.push_back(INT_MAX);
    }
  }
  int cur = 0;
  for (int i = 0; i < Q; i++){
        int q = F[i].first, s = F[i].second;
        while (cur != costs.size() && costs[cur].first <= q){
            int a = costs[cur].second.first;
            int b = costs[cur].second.second;
            if (b - a == 1){
                int start = 0, ends = segments.size() - 2;
                while (segments[start].second != a){
                    int k = (start + ends + 1) / 2;
                    if (segments[k].second <= a){
                        start = k;
                    }
                    else ends = k - 1;
                }
                diffe -= diffs[start];
                diffe -= diffs[start+1];
                segments.insert(segments.begin() + start, {segments[start].first, segments[start+1].second});
                segments.erase(segments.begin() + start + 1);
                segments.erase(segments.begin() + start + 1);
                diffs.erase(diffs.begin() + start);
                diffs.erase(diffs.begin() + start);
                mins.insert(mins.begin() + start, min(mins[start], mins[start+1]));
                mins.erase(mins.begin() + start + 1);
                mins.erase(mins.begin() + start + 1);
                mino.insert(mino.begin() + start, min(mino[start], mino[start+1]));
                mino.erase(mino.begin() + start + 1);
                mino.erase(mino.begin() + start + 1);
                mine.insert(mine.begin() + start, min(mine[start], mine[start+1]));
                mine.erase(mine.begin() + start + 1);
                mine.erase(mine.begin() + start + 1);
                if ((segments[start].second + 1 - segments[start].first) % 2 == 0) diffs.insert(diffs.begin() + start, 0);
                else{
                    long long g;
                    if (segments[start].first % 2 == 0){
                        g = mine[start];
                    }
                    else g = mino[start];
                    g = min(g, mins[start]);
                    diffs.insert(diffs.begin() + start, g);
                    diffe += g;
                }
            }
            else{
                int start = 0, ends = segments.size() - 1;
                while (start != ends){
                    int k = (start + ends + 1) / 2;
                    if (segments[k].first <= a){
                        start = k;
                    }
                    else ends = k - 1;
                }
                mins[start] = min(mins[start], C[a+1].second);
                diffe -= diffs[start];
                diffs[start] = min(diffs[start], mins[start]);
                diffe += diffs[start];
            }
            cur++;
        }
        R[s] = sum + diffe;
  }
  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...