Submission #796051

# Submission time Handle Problem Language Result Execution time Memory
796051 2023-07-28T05:26:38 Z NeroZein The Potion of Great Power (CEOI20_potion) C++17
56 / 100
3000 ms 109416 KB
#include <bits/stdc++.h>
 
using namespace std;
 
const int INF = 1e9; 
const int MX_N = 1e5 + 5;
const int MX_DAYS = 2e5 + 5;
const int MX_NODES = (MX_N + MX_DAYS) * 30;
 
int idd;
int ppl;
int h[MX_N];
unordered_map<int, int> to; 
set<pair<int, int>> friends;
vector<pair<int, int>> versions[MX_N];

int tree[MX_NODES];
int root[MX_NODES];
int L[MX_NODES], R[MX_NODES];

int upd (int nd, int l, int r, int p, int v) {
  int nx = ++idd;
  if (l == r) {
    tree[nx] = tree[nd] + v;
    return nx;
  }
  int mid = (l + r) >> 1;
  if (p <= mid) {
    L[nx] = upd(L[nd], l, mid, p, v);
    R[nx] = R[nd];
  } else {
    L[nx] = L[nd];
    R[nx] = upd(R[nd], mid + 1, r, p, v); 
  }
  tree[nx] = tree[L[nx]] + tree[R[nx]];
  return nx;
}

void dive (int nd, int l, int r, vector<int>& vec) {
  if (l == r) {
    vec.push_back(l);
    return;
  }
  int mid = (l + r) >> 1;
  if (L[nd] && tree[L[nd]]) {
    dive(L[nd], l, mid, vec);
  }
  if (R[nd] && tree[R[nd]]) {
    dive(R[nd], mid + 1, r, vec); 
  }
}

pair<int, int> invert (int u, int v, int uVersion, int vVersion) {
  int rootU, rootV;
  if (friends.count({u, v})) {
    rootU = upd(uVersion, 0, ppl - 1, h[v], -1);
    rootV = upd(vVersion, 0, ppl - 1, h[u], -1);
    friends.erase({u, v});
  } else {
    rootU = upd(uVersion, 0, ppl - 1, h[v], +1);
    rootV = upd(vVersion, 0, ppl - 1, h[u], +1);
    friends.emplace(u, v); 
  }
  return make_pair(rootU, rootV); 
}

void compress () {
  map<int, int> mp;
  int cnt = 0; 
  for (int i = 0; i < ppl; ++i) {
    mp[h[i]];
  }
  for (auto& it : mp) {
    it.second = cnt++; 
  }
  for (int i = 0; i < ppl; ++i) {
    to[mp[h[i]]] = h[i]; 
    h[i] = mp[h[i]];
  }
}

void init(int N, int D, int H[]) {
  ppl = N; 
  for (int i = 0; i < ppl; ++i) {
    h[i] = H[i];
    versions[i].emplace_back(0, ++idd);
  }
  compress();
}
 
void curseChanges(int U, int A[], int B[]) {
  for (int day = 1; day <= U; ++day) {
    int u = A[day - 1], v = B[day - 1];
    if (u > v) swap(u, v); 
    int verU = versions[u].back().second;
    int verV = versions[v].back().second;
    auto [ru, rv] = invert(u, v, verU, verV); 
    versions[u].emplace_back(day, ru);
    versions[v].emplace_back(day, rv); 
  }
}
 
int getDis (vector<int> h1, vector<int> h2) {
  if (h1.empty() || h2.empty()) {
    return INF; 
  }
  int ret = INF; 
  int i = 0, j = 0;
  int n = h1.size(), m = h2.size();
  while (i < n || j < m) {
    if (i < n && (j == m || h1[i] < h2[j])) {
      if (j < m) {
        ret = min(ret, to[h2[j]] - to[h1[i]]);        
      }
      i++;
    } else {
      if (i < n) {
        ret = min(ret, to[h1[i]] - to[h2[j]]);         
      }
      j++; 
    }
  }
  return ret;
} 

int question(int u, int v, int day) {//p1, p2, day
  pair<int,int> verV = *prev(lower_bound(versions[v].begin(), versions[v].end(), make_pair(day, INF)));
  pair<int,int> verU = *prev(lower_bound(versions[u].begin(), versions[u].end(), make_pair(day, INF)));
  vector<int> h1, h2;
  dive(verV.second, 0, ppl - 1, h1);
  dive(verU.second, 0, ppl - 1, h2);
  return getDis(h1, h2); 
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2640 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 3024 KB Output is correct
2 Correct 3 ms 3024 KB Output is correct
3 Correct 3 ms 3060 KB Output is correct
4 Correct 97 ms 16188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 661 ms 109412 KB Output is correct
2 Correct 665 ms 109416 KB Output is correct
3 Correct 353 ms 99736 KB Output is correct
4 Execution timed out 3051 ms 64640 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 481 ms 106476 KB Output is correct
2 Correct 302 ms 97628 KB Output is correct
3 Correct 425 ms 99308 KB Output is correct
4 Correct 415 ms 99208 KB Output is correct
5 Correct 417 ms 106216 KB Output is correct
6 Correct 347 ms 99208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 73 ms 7488 KB Output is correct
2 Correct 173 ms 7300 KB Output is correct
3 Correct 276 ms 7308 KB Output is correct
4 Correct 1350 ms 7400 KB Output is correct
5 Correct 1138 ms 7576 KB Output is correct
6 Correct 187 ms 6100 KB Output is correct
7 Correct 1180 ms 7344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2640 KB Output is correct
2 Correct 3 ms 3024 KB Output is correct
3 Correct 3 ms 3024 KB Output is correct
4 Correct 3 ms 3060 KB Output is correct
5 Correct 97 ms 16188 KB Output is correct
6 Correct 661 ms 109412 KB Output is correct
7 Correct 665 ms 109416 KB Output is correct
8 Correct 353 ms 99736 KB Output is correct
9 Execution timed out 3051 ms 64640 KB Time limit exceeded
10 Halted 0 ms 0 KB -