제출 #1324204

#제출 시각아이디문제언어결과실행 시간메모리
1324204nikaa123나일강 (IOI24_nile)C++20
0 / 100
38 ms9244 KiB
#include <bits/stdc++.h>
#include "nile.h"
using namespace std;

vector<long long> calculate_costs(vector<int> W, vector<int> A,
                                      vector<int> B, vector<int> E) {
  int N = W.size();
  int Q = (int)E.size();
  vector < array<int,3> > arr;
  for (int i = 0; i < N; i++) {
    arr.push_back({W[i],A[i],B[i]});
  }
  sort(arr.begin(),arr.end());
  vector <int> c(N);
  for (int i = 0; i < N; i++) {
    c[i] = arr[i][1]-arr[i][2];
  }
  vector <array<int,3>> lst;
  for (int i = 0; i < N-1; i++) {
    lst.push_back({arr[i+1][0] - arr[i][0],-1,i});
    if (i+2 < N) lst.push_back({arr[i+2][0] - arr[i][0],-2,i});
  }
  for (int i = 0; i < Q; i++) {
    lst.push_back({E[i],0,i});
  }
  sort(lst.begin(),lst.end());

  //dsu
  int ans = 0;;
  vector <int> par(N);
  vector <int> bsum(N);
  vector <int> sz(N);
  vector <int> l(N);
  vector <array<int,2>> mn(N);
  vector <int> mn1(N);
  for (int i = 0; i < N; i++) {
    ans += arr[i][2];
    l[i] = i;
    par[i] = i;
    bsum[i] = arr[i][2];
    sz[i] = 1;
    mn[i][0] = mn[i][1] = INT_MAX;
    mn[i][i&1] = c[i]; 
    mn1[i] = INT_MAX;
  }

  function<int(int)> getpar = [&](int x) {
    if (x == par[x]) return x;
    return par[x] = getpar(par[x]);
  };

  auto getans = [&](int x) {
    return (bsum[x] + (sz[x]&1 ? min(mn1[x],mn[x][l[x]&1]):0));
  }; 

  auto unionset = [&](int a, int b) {
    a = getpar(a);
    b = getpar(b);
    if (a == b) return;
    ans -= getans(a);
    ans -= getans(b);
    sz[a] += sz[b];
    mn1[a] = min(mn1[a],mn1[b]);
    l[a] = min(l[a],l[b]);
    par[b] = a;
    bsum[a] += bsum[b];
    mn1[a] = min(mn1[a],mn1[b]);
    mn[a][0] = min(mn[a][0],mn[b][0]);
    mn[a][1] = min(mn[a][1],mn[b][1]);
    ans += getans(a);
  };

  vector<long long> R(Q, 0);
  for (auto cur:lst) {
    if (cur[1] == 0) R[cur[2]] = ans;
    if (cur[1] == -1) {
      unionset(cur[2],cur[2]+1);
    }
    if (cur[1] == -2) {
      int x = getpar(cur[2]);
      ans -= getans(x);
      mn1[x] = min(mn1[x],c[cur[2]+1]);
      ans += getans(x); 
    }
  }
  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...