Submission #1138173

#TimeUsernameProblemLanguageResultExecution timeMemory
1138173repmannNile (IOI24_nile)C++20
38 / 100
53 ms10056 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int N, Q;
struct NODE
{
  int parent, ranking;
  ll minimum, sum;
  bool odd;
}DSU[100096];
struct EDGE
{
  int u, v, w;
}E[100096];
inline bool comp(EDGE e1, EDGE e2) {return e1.w < e2.w;}
inline int Find(int i)
{
  while(DSU[i].parent != i) i = DSU[i].parent;
  return i;
}
inline ll Union(int u, int v)
{
  u = Find(u);
  v = Find(v);
  if(u == v) return 0;
  ll RET = DSU[u].sum + DSU[u].minimum * DSU[u].odd + DSU[v].sum + DSU[v].minimum * DSU[v].odd;
  if(DSU[u].ranking < DSU[v].ranking) swap(u, v);
  DSU[u].ranking += DSU[u].ranking == DSU[v].ranking;
  DSU[v].parent = u;
  DSU[u].minimum = min(DSU[v].minimum, DSU[u].minimum);
  DSU[u].sum += DSU[v].sum;
  DSU[u].odd ^= DSU[v].odd;
  RET -= DSU[u].sum + DSU[u].minimum * DSU[u].odd;
  return RET;
}
vector <ll> calculate_costs(vector <int> W, vector <int> A, vector <int> B, vector <int> D)
{
  N = W.size();
  Q = D.size();
  vector <ll> O(Q);
  vector <pair <int, int>> MO(Q), V(N);
  for(int i = 0; i < Q; i++) MO[i] = {D[i], i};
  sort(MO.begin(), MO.end());
  for(int i = 0; i < N; i++) V[i] = {W[i], i};
  sort(V.begin(), V.end());
  for(int i = 1; i < N; i++) E[i] = {V[i - 1].second, V[i].second, V[i].first - V[i - 1].first};
  sort(E + 1, E + N, comp);
  for(int i = 0; i < N; i++) DSU[i] = {i, 0, A[i] - B[i], B[i], true};
  ll temp = 0;
  for(int i = 0; i < N; i++) temp += A[i];
  int i = 1;
  for(pair <int, int> p : MO)
  {
    while((i < N) && (E[i].w <= p.first))
    {
      temp -= Union(E[i].u, E[i].v);
      i++;
    }
    O[p.second] = temp;
  }
  return O;
}
//int main()
//{
//  int n, q;
//  cin >> n >> q;
//  vector <int> w(n), a(n), b(n), d(q);
//  for(int i = 0; i < n; i++) cin >> w[i];
//  for(int i = 0; i < n; i++) cin >> a[i];
//  for(int i = 0; i < n; i++) cin >> b[i];
//  for(int i = 0; i < q; i++) cin >> d[i];
//  for(int x : calculate_costs(w, a, b, d)) cout << x << '\n';
//
//  return 0;
//}
#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...