Submission #611197

#TimeUsernameProblemLanguageResultExecution timeMemory
611197alireza_kavianiMinerals (JOI19_minerals)C++17
40 / 100
45 ms7688 KiB
#include "minerals.h"
#include <bits/stdc++.h>
using namespace std;

#define SZ(x) int((x).size())

const int MAXN = 1e5 + 10;
const int LOG = 16;

int n , cnt , L[MAXN] , M[MAXN] , R[MAXN] , mark[MAXN];
vector<int> v1 , v2 , Q[MAXN];

int query(int ind , int x){
  cnt -= mark[x];
  mark[x] ^= 1;
  cnt += mark[x];
  int res = Query(x);
  if(ind % 2 == 0){
    return res;
  }
  return n + res - cnt;
}

void Solve(int N) {
  n = N;
  for(int i = 1 ; i <= 2 * n ; i++){
    int x = query(0 , i);
    if(x == SZ(v1)){
      v2.push_back(i);
    }
    else{
      v1.push_back(i);
    }
  }

  for(int i = 0 ; i < n ; i++){
    L[i] = -1; R[i] = n - 1;
  }

  for(int i = 0 ; i < LOG ; i++){
    for(int j = 0 ; j < n ; j++){
      Q[j].clear();
    }
    for(int j = 0 ; j < n ; j++){
      M[j] = max(0 , (R[j] + L[j]) / 2);
      Q[M[j]].push_back(j);
    }
    for(int j = 0 ; j < n ; j++){
      int x = query(i + 1 , v1[j]);
      for(int k : Q[j]){
        int y = query(i + 1 , v2[k]);
        if(x != y){
          L[k] = M[k];
        }
        else{
          R[k] = M[k];
        }
        x = y;
      }
    }
  }
  for(int i = 0 ; i < n ; i++){
    Answer(v2[i] , v1[R[i]]);
  }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...