답안 #796061

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
796061 2023-07-28T05:37:58 Z NeroZein The Potion of Great Power (CEOI20_potion) C++17
21 / 100
1144 ms 106876 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];
int to[MX_N];
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; 
  for (int i = 0; i < ppl; ++i) {
    h[i] = H[i];
    to[i] = H[i];
    versions[i].emplace_back(0, ++idd);
  }
  sort(to, to + ppl); 
  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]]);        
        assert(h1[i] < MX_N);
        assert(h2[j] < MX_N);
      }
      i++;
    } else {
      if (i < n) {
        assert(h1[i] < MX_N);
        assert(h2[j] < MX_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 2 ms 2640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 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 Incorrect 64 ms 12092 KB Incorrect
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 470 ms 105340 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 369 ms 106876 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 7280 KB Output is correct
2 Correct 151 ms 6864 KB Output is correct
3 Correct 204 ms 6968 KB Output is correct
4 Correct 1144 ms 7040 KB Output is correct
5 Correct 988 ms 7212 KB Output is correct
6 Correct 155 ms 6076 KB Output is correct
7 Correct 918 ms 6944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 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 3024 KB Output is correct
5 Incorrect 64 ms 12092 KB Incorrect
6 Halted 0 ms 0 KB -