Submission #1131452

#TimeUsernameProblemLanguageResultExecution timeMemory
1131452huutuanIsland Hopping (JOI24_island)C++20
65 / 100
5 ms448 KiB
#include "island.h"

#include <bits/stdc++.h>

using namespace std;

vector<pair<int, int>> a;

int f[300][300], tr[300][300];

int dp(int l, int r){
   if (l>r) return 0;
   if (f[l][r]!=-1) return f[l][r];
   if (l==r && a[l].second==1){
      tr[l][r]=-1;
      return f[l][r]=0;
   }
   pair<int, int> res={(int)1e9, -1};
   for (int j=l; j<=r; ++j){
      res=min(res, {1+max(dp(l, j-1), dp(j+1, r)), j});
   }
   tr[l][r]=res.second;
   return f[l][r]=res.first;
}

void solve(int _N, int _L) {
   int query_count=0;
   mt19937 rng(69420);
   int n=_N;
   int root=0;
   vector<int> bfs_order{root}, pos(n);
   for (int i=1; i<n; ++i) bfs_order.push_back(query(root+1, i)-1), ++query_count;
   for (int i=0; i<n; ++i) pos[bfs_order[i]]=i;
   vector<vector<int>> child(n);
   vector<int> par(n);
   vector<int> check(n);
   for (int i=n-1; i>=1; --i){
      int u=bfs_order[i];
      sort(child[u].begin(), child[u].end());
      for (int j:child[u]) check[j]=1;
      vector<int> cnt(child[u].size()+1), save(child[u].size()+1);
      for (int j=0; j<i; ++j){
         int v=bfs_order[j];
         int t=lower_bound(child[u].begin(), child[u].end(), v)-child[u].begin();
         ++cnt[t];
         save[t]=v;
      }
      a.clear();
      for (int j=0; j<=(int)child[u].size(); ++j) if (cnt[j]){
         a.emplace_back(j, cnt[j]);
      }
      for (int j=0; j<=(int)child[u].size(); ++j) for (int k=0; k<=(int)child[u].size(); ++k){
         f[j][k]=-1;
      }
      dp(0, (int)a.size()-1);
      cerr << query_count << endl;
      if (query_count==638){
         query_count=638;
      }
      int l=0, r=a.size()-1;
      while (1){
         int mid=tr[l][r];
         int v=-1;
         if (l==r && f[l][r]==0){
            v=save[a[l].first];
         }else{
            v=query(u+1, a[mid].first+1)-1, ++query_count;
         }
         if (!check[v]){
            par[u]=v;
            child[v].push_back(u);
            break;
         }
         if (child[u][a[mid].first]==v) l=mid+1;
         else r=mid-1;
      }
      for (int j:child[u]) check[j]=0;
   }
   for (int i=0; i<n; ++i) if (i!=root) answer(i+1, par[i]+1);
}
#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...