답안 #796048

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
796048 2023-07-28T05:25:05 Z NeroZein The Potion of Great Power (CEOI20_potion) C++17
56 / 100
3000 ms 109608 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];
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);
  //cout << "U, V: " << u << ' ' << v << '\n';
  //cout << "VALS OF U'S FRIENDS: ";
  //for (int i : h1) {
    //cout << to[i] << ' ';
  //}
  //cout << '\n';
  //cout << "VALS OF V'S FRIENDS: ";
  //for (int i : h2) {
    //cout << to[i] << ' ';
  //}
  //cout << '\n';
  return getDis(h1, h2); 
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 3108 KB Output is correct
2 Correct 3 ms 3024 KB Output is correct
3 Correct 5 ms 3004 KB Output is correct
4 Correct 118 ms 16324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 807 ms 109608 KB Output is correct
2 Correct 839 ms 109596 KB Output is correct
3 Correct 546 ms 99980 KB Output is correct
4 Execution timed out 3023 ms 64652 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 471 ms 106480 KB Output is correct
2 Correct 275 ms 97636 KB Output is correct
3 Correct 367 ms 99328 KB Output is correct
4 Correct 364 ms 99152 KB Output is correct
5 Correct 459 ms 106104 KB Output is correct
6 Correct 360 ms 99280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 82 ms 7588 KB Output is correct
2 Correct 223 ms 7376 KB Output is correct
3 Correct 421 ms 7316 KB Output is correct
4 Correct 2944 ms 7484 KB Output is correct
5 Correct 2572 ms 7648 KB Output is correct
6 Correct 285 ms 6124 KB Output is correct
7 Correct 2344 ms 7324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2640 KB Output is correct
2 Correct 3 ms 3108 KB Output is correct
3 Correct 3 ms 3024 KB Output is correct
4 Correct 5 ms 3004 KB Output is correct
5 Correct 118 ms 16324 KB Output is correct
6 Correct 807 ms 109608 KB Output is correct
7 Correct 839 ms 109596 KB Output is correct
8 Correct 546 ms 99980 KB Output is correct
9 Execution timed out 3023 ms 64652 KB Time limit exceeded
10 Halted 0 ms 0 KB -