Submission #799273

# Submission time Handle Problem Language Result Execution time Memory
799273 2023-07-31T11:33:29 Z NeroZein The Potion of Great Power (CEOI20_potion) C++17
17 / 100
336 ms 44628 KB
#include "bits/stdc++.h"

using namespace std;

const int C = 50;
const int N = 1e5 + 5;
const int U = 2e5 + 5;
const int INF = 1e9; 

int h[N]; 

struct cmp {
  bool operator ()(int i, int j) const {
    return h[i] < h[j];
  }
};

void print (int u, set<int, cmp> se) {
  cout << "U: " << u << '\n';
  cout << "SE: ";
  for (int i : se) cout << i << ' ';
  cout << '\n';
}

int a[U], b[U];
set<int, cmp> cur[N]; 
vector<int> edits[N];
vector<set<int, cmp>> versions[N];


void edit (int v, set<int, cmp>& seU) {
  if (seU.count(v)) {
    seU.erase(v);
  } else {
    seU.insert(v);
  }
}

void init (int N_, int D, int H[]) {
  for (int i = 0; i < N_; ++i) {
    edits[i].push_back(0); 
    versions[i].push_back({});
    h[i] = H[i];
  }
}

void curseChanges (int U_, int A[], int B[]) {
  for (int day = 1; day <= U_; ++day) {
    a[day] = A[day - 1];
    b[day] = B[day - 1];
    edit(b[day], cur[a[day]]);
    edit(a[day], cur[b[day]]); 
    edits[a[day]].push_back(day);
    edits[b[day]].push_back(day);
    if (edits[a[day]].size() % C == 0) {
      versions[a[day]].push_back(cur[a[day]]);
    }
    if (edits[b[day]].size() % C == 0) {
      versions[b[day]].push_back(cur[a[day]]); 
    }
  }
}

int getDis (vector<int> h1, vector<int> h2) {//n + m
  if (h1.empty() || h2.empty()) {
    return INF; 
  }
  assert(is_sorted(h1.begin(), h1.end()));
  assert(is_sorted(h2.begin(), h2.end()));
  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, h2[j] - h1[i]);        
      }
      i++;
    } else {
      if (i < n) {
        ret = min(ret, h1[i] - h2[j]);         
      }
      j++; 
    }
  }
  return ret;
} 

int question (int x, int y, int v) {
  vector<int> vv[2] = {};
  vector<set<int, cmp>> se(2); 
  for (int rep = 0; rep < 2; ++rep) {
    int last_edit = upper_bound(edits[x].begin(), edits[x].end(), v) - edits[x].begin() - 1;
    se[rep] = versions[x][last_edit / C];
    int st = last_edit - (last_edit % C) + 1;
    for (; st <= last_edit; ++st) {
      int i = a[edits[x][st]], j = b[edits[x][st]];
      if (i != x) {
        assert(j == x);
        swap(i, j);
      }
      edit(j, se[rep]); 
    }
    for (auto i : se[rep]) vv[rep].push_back(h[i]);
    swap(x, y);
  }
  return getDis(vv[0], vv[1]); 
}
# Verdict Execution time Memory Grader output
1 Correct 4 ms 9680 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 9864 KB Output is correct
2 Correct 5 ms 9944 KB Output is correct
3 Correct 5 ms 9936 KB Output is correct
4 Correct 29 ms 20000 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 336 ms 44564 KB Output is correct
2 Correct 316 ms 44628 KB Output is correct
3 Incorrect 92 ms 28828 KB Incorrect
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 171 ms 30424 KB Incorrect
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 46 ms 11856 KB Output is correct
2 Incorrect 10 ms 11088 KB Incorrect
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 9680 KB Output is correct
2 Correct 6 ms 9864 KB Output is correct
3 Correct 5 ms 9944 KB Output is correct
4 Correct 5 ms 9936 KB Output is correct
5 Correct 29 ms 20000 KB Output is correct
6 Correct 336 ms 44564 KB Output is correct
7 Correct 316 ms 44628 KB Output is correct
8 Incorrect 92 ms 28828 KB Incorrect
9 Halted 0 ms 0 KB -