Submission #1278732

#TimeUsernameProblemLanguageResultExecution timeMemory
1278732noyancanturkMeetings (JOI19_meetings)C++20
29 / 100
1066 ms1128 KiB
#include "meetings.h"
#include<bits/stdc++.h>
using namespace std;

#define query Query
#define answer Bridge
#define pb push_back

const int lim=2100;

unordered_set<int>v[lim];

vector<int>ch;

int dfs(int node,int par,int targ){
  if(node==targ){
    ch.clear();
    ch.pb(node);
    return 1;
  }
  for(int j:v[node]){
    if(j==par)continue;
    if(dfs(j,node,targ)){
      ch.pb(node);
      return 1;
    }
  }
  return 0;
}

int gonna[lim];

void killall(int node,int par,int targ){
  if(node==targ)return;
  gonna[node]=0;
  for(int j:v[node]){
    if(j==par)continue;
    killall(j,node,targ);
  }
}

void Solve(int n){
  v[0].insert(1);
  v[1].insert(0);
  int vis[n]{};
  vis[0]=vis[1]=1;
  for(int i=2;i<n;i++){
    if(vis[i])continue;
    for(int j=0;j<n;j++)gonna[j]=1;
    while(!vis[i]){
      int cnt=0,dude=0;
      for(int j=0;j<n;j++){
        if(vis[j]&&gonna[j]){
          // cerr<<j<<" active\n";
          cnt++;
          dude=j;
        }
      }
      if(cnt==1){
        // cerr<<"ma dude "<<i<<' '<<dude<<'\n';
        vis[i]=1;
        v[i].insert(dude);
        v[dude].insert(i);
        break;
      }
      vector<int>leafs;
      for(int j=0;j<n;j++){
        if(vis[j]&&gonna[j]){
          int cc=0;
          for(int k:v[j]){
            cc+=vis[k]&&gonna[k];
            if(cc==2)break;
          }
          if(cc==1){
            leafs.pb(j);
            if(leafs.size()==2)break;
          }
        }
      }
      // cerr<<cnt<<' '<<leafs.size()<<'\n';
      assert(leafs.size()==2);
      // cerr<<leafs[0]<<' '<<leafs[1]<<' '<<i<<'\n';
      int res=query(leafs[0],leafs[1],i);
      // cerr<<"asked "<<leafs[0]<<' '<<leafs[1]<<' '<<i<<' '<<res<<'\n';
      if(!vis[res]){
        // cerr<<"missing "<<leafs[0]<<' '<<leafs[1]<<' '<<res<<'\n';
        dfs(leafs[0],-1,leafs[1]);
        // cerr<<"ch : ";
        // for(int jj:ch)cerr<<jj<<' ';
        // cerr<<'\n';
        // assert(ch.size()>=2);
        // assert(ch[0]==leafs[1]&&ch.back()==leafs[0]);
        int l=1,r=ch.size()-2,ans=ch.size()-1;
        while(l<=r){
          int mid=l+r>>1;
          // cerr<<ch[mid]<<' '<<ch.back()<<' '<<res<<'\n';
          int cur=query(ch[mid],ch.back(),res);
          if(cur==res){
            l=mid+1;
          }else{
            ans=mid;
            r=mid-1;
          }
        }
        // cerr<<"here\n";
        // cerr<<ch[ans]<<' '<<ch[ans-1]<<' '<<res<<" inserted\n";
        // assert(v[ch[ans]].count(ch[ans-1]));
        v[ch[ans]].erase(ch[ans-1]);
        v[ch[ans-1]].erase(ch[ans]);
        v[ch[ans]].insert(res);
        v[res].insert(ch[ans]);
        v[ch[ans-1]].insert(res);
        v[res].insert(ch[ans-1]);
        vis[res]=1;
      }
      killall(leafs[0],-1,res);
      killall(leafs[1],-1,res);
      gonna[res]=1;
    }
    // for(int i=0;i<n;i++){
    //   for(int j:v[i]){
    //     cerr<<i<<' '<<j<<'\n';
    //   }
    // }cerr<<'\n';
  }
  for(int i=0;i<n;i++){
    for(int j:v[i]){
      // cerr<<i<<' '<<j<<'\n';
      if(i<j){
        answer(i,j);
      }
    }
  }
}

// void Solve(int N) {
//   int x = Query(0, 1, 2);
//   for (int u = 0; u < N - 1; ++u) {
//     Bridge(u, u + 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...