Submission #1204091

#TimeUsernameProblemLanguageResultExecution timeMemory
1204091MuhammadSaramPark (JOI17_park)C++20
In queue
0 ms0 KiB
#include "park.h" #include <bits/stdc++.h> using namespace std; map<pair<int,int>,bool> mp; bool comp(int a,int b) { if (!mp.count({a,b})) { int on[1400]={}; for (int i=0;i<1400;i++) on[i]=1; on[a]=0; if (Ask(0,b,on)) mp[{a,b}]=0,mp[{b,a}]=1; else mp[{a,b}]=1,mp[{b,a}]=0; } return mp[{a,b}]; } void Detect(int T, int n){ int on[1400]={}; if (T==1) { for (int i=0;i<n;i++) for (int j=i+1;j<n;j++) { on[i]=on[j]=1; if (Ask(i,j,on)) Answer(i,j); on[i]=on[j]=0; } return; } else if(T==2) { if (n==2) { Answer(0,1); return; } vector<int> v; for (int i=1;i<n-1;i++) v.push_back(i); sort(v.begin(),v.end(),comp); Answer(0,v[0]); Answer(v.back(),n-1); for (int i=0;i+1<v.size();i++) Answer(min(v[i],v[i+1]),max(v[i],v[i+1])); } vector<int> dep[9]; dep[0]={0}; int par[n]; bool vis[n]={}; for (int d=1;d<=9;d++) { for (int j=d-1;j>=0;j--) for (int u:dep[j]) on[u]=1; for (int i=1;i<n;i++) if (!vis[i]) { on[i]=1; if (Ask(0,i,on)) dep[d].push_back(i),vis[i]=1; on[i]=0; } for (int i=0;i<n;i++) on[i]=0; for (int u:dep[d]) { int s=-1,e=dep[d-1].size()-1; while (s+1<e) { int mid=(s+e)/2; on[0]=on[u]=1; for (int j=0;j<=mid;j++) { int v=dep[d-1][j]; while (v) on[v]=1,v=par[v]; } if (Ask(0,u,on)) e=mid; else s=mid; for (int i=0;i<n;i++) on[i]=0; } par[u]=dep[d-1][e]; Answer(min(par[u],u),max(par[u],u)); } } }