Submission #1343847

#TimeUsernameProblemLanguageResultExecution timeMemory
1343847hyyhIsland Hopping (JOI24_island)C++20
65 / 100
4 ms668 KiB
#include "island.h"
#include <vector>
#include <set>
#include <iostream>

using namespace std;

void solve(int N, int L) {
  vector<vector<bool>> adj(N+1,vector<bool>(N+1,0));
  vector<bool> complete(N+1,0);
  vector<int> ask(N+1,0);
  vector<vector<int>> save(N+1,vector<int>(N,-1));
  int cnt = 0;
  auto fakequery = [&](int v,int k){
    if(save[v][k] != -1) return save[v][k];
    else return save[v][k] = query(v,k);
  };
  auto connect = [&](int a,int b){
    if(!adj[a][b]){
      cnt++;
      adj[a][b] = 1;
      adj[b][a] = 1;
    }
  };
auto process = [&](int n){
    if(complete[n] || cnt == N-1) return;
    int i = 1;
    vector<int> far(N+1);
    while(true){
      if(i == N || cnt == N-1){
        complete[n] = 1;
        break;
      }
      int ret = fakequery(n,i++);
      if(far[ret]){
        complete[n] = 1;
        break;
      }
      connect(ret,n);
      for(int j{1};j <= N;j++){
        if(j != n && adj[ret][j]) far[j] = 1;
      }
      int back = fakequery(ret,ask[ret]+1);
      if(back < n) far[back] = 1,ask[ret]++,connect(back,ret);
      else complete[ret] = 1;
    }
  };
  for(int i{N};i >= 1;i--) process(i);
  for(int i{1};i <= N;i++){
    for(int j{1};j <= N;j++){
      if(i < j && adj[i][j]) answer(i,j);
    }
  }
}
#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...