답안 #796063

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
796063 2023-07-28T05:40:07 Z NeroZein The Potion of Great Power (CEOI20_potion) C++17
56 / 100
3000 ms 106980 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];
vector<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) {
    h[i] = mp[h[i]];
  }
}
 
void init(int N, int D, int H[]) {
  ppl = N; 
  to.resize(ppl);
  for (int i = 0; i < ppl; ++i) {
    h[i] = H[i];
    to[i] = H[i];
    versions[i].emplace_back(0, ++idd);
  }
  sort(to.begin(), to.end()); 
  to.resize((unique(to.begin(), to.begin() + ppl) - to.begin()));
  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) {
  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); 
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 3024 KB Output is correct
2 Correct 3 ms 3024 KB Output is correct
3 Correct 3 ms 3024 KB Output is correct
4 Correct 66 ms 12100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 701 ms 105388 KB Output is correct
2 Correct 633 ms 105388 KB Output is correct
3 Correct 364 ms 95676 KB Output is correct
4 Execution timed out 3056 ms 64616 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 465 ms 106980 KB Output is correct
2 Correct 269 ms 98024 KB Output is correct
3 Correct 391 ms 99708 KB Output is correct
4 Correct 377 ms 99632 KB Output is correct
5 Correct 452 ms 106560 KB Output is correct
6 Correct 380 ms 99636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 7248 KB Output is correct
2 Correct 139 ms 6928 KB Output is correct
3 Correct 220 ms 6936 KB Output is correct
4 Correct 1117 ms 6992 KB Output is correct
5 Correct 1048 ms 7240 KB Output is correct
6 Correct 163 ms 5968 KB Output is correct
7 Correct 945 ms 6992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2640 KB Output is correct
2 Correct 5 ms 3024 KB Output is correct
3 Correct 3 ms 3024 KB Output is correct
4 Correct 3 ms 3024 KB Output is correct
5 Correct 66 ms 12100 KB Output is correct
6 Correct 701 ms 105388 KB Output is correct
7 Correct 633 ms 105388 KB Output is correct
8 Correct 364 ms 95676 KB Output is correct
9 Execution timed out 3056 ms 64616 KB Time limit exceeded
10 Halted 0 ms 0 KB -