제출 #1289055

#제출 시각아이디문제언어결과실행 시간메모리
1289055loomThe Potion of Great Power (CEOI20_potion)C++20
38 / 100
3100 ms258444 KiB
#include<bits/stdc++.h>
using namespace std;
#define inf (int)1e9
#define nl '\n'

const int N = 1e5+1, l = 4347, k = 47;
int h[N], a[2*N], b[2*N];
unordered_map<int,int> g[N];
vector<int> sg[k][N];

void init(int n, int D, int H[]){
   for(int i = 0; i < n; i++) h[i] = H[i];
}

void curseChanges(int u, int A[], int B[]){
   unordered_map<int,int> cg[N];

   for(int i = 1; i <= u; i++){
      a[i] = A[i-1];
      b[i] = B[i-1];
      int x = a[i], y = b[i];

      cg[x][y]++;
      cg[y][x]++;

      if(i % l == 0){
         int div = i/l;

         for(int j = 0; j < N; j++){
            sg[div][j].reserve(cg[j].size());

            for(auto &[z, c] : cg[j]){
               if(c % 2) sg[div][j].push_back(z);
            }
         }
      }
   } 
}

int question(int p, int q, int v){
   int div = v/l;
   auto &cg = sg[div];

   for(int &x : cg[p]) g[p][x]++;
   for(int &x : cg[q]) g[q][x]++;

   for(int i = div * l + 1; i <= v; i++){
      int x = a[i], y = b[i];

      if(x == p or x == q) g[x][y]++;
      if(y == p or y == q) g[y][x]++;
   }

   vector<int> v1, v2;

   for(auto &[x, c] : g[p]){
      if(c % 2) v1.push_back(h[x]);
   }
   for(auto &[x, c] : g[q]){
      if(c % 2) v2.push_back(h[x]);
   }

   g[p].clear();
   g[q].clear();

   sort(v1.begin(), v1.end());
   sort(v2.begin(), v2.end());

   int s1 = v1.size(), s2 = v2.size();
   int ans = inf;

   for(int i = 0, j = -1; i < s1; i++){
      while(j+1 < s2 and v2[j+1] <= v1[i]) j++;

      ans = min(ans, min(j >= 0 ? v1[i] - v2[j] : inf, j+1 < s2 ? v2[j+1] - v1[i] : inf));
   }

   return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...