제출 #1327795

#제출 시각아이디문제언어결과실행 시간메모리
1327795wangzhiyi33Chameleon's Love (JOI20_chameleon)C++20
100 / 100
41 ms476 KiB
#include "chameleon.h"
#include <bits/stdc++.h>
using namespace std;

vector<int>adj[1002];

void Solve(int N) {
  vector<int> p;

  for(int q=2;q<=2*N;q++){
    bool vis[q+1]; memset(vis,false,sizeof vis);
    vector<int>col[2];
    queue<pair<int,int> >qu;
    
    for(int w=1;w<q;w++){
      if(vis[w])continue;
      qu.push({w,0});

      while(qu.size()){
        auto[a,b]=qu.front(); qu.pop();
        col[b].push_back(a);
        vis[a]=true;
        for(auto x : adj[a]){
          if(vis[x])continue;
          qu.push({x,1-b}); vis[x]=true;
        }
      }
    }
    

    for(int w=0;w<2;w++){
      p=col[w];p.push_back(q);
      int brp=Query(p);
      int mul=0;

      while(p.size()>brp){
        int l=mul,r=col[w].size()-1;
        int mana=-1;

        while(l<=r){
          int mid=(l+r)/2;
          p.clear();
          for(int e=mul;e<=mid;e++){
            p.push_back(col[w][e]);
          //  cout<<col[w][e]<<"K"<<endl;
          }
          p.push_back(q);

          if(Query(p)<p.size()){
            mana=mid;
            r=mid-1;
          }
          else{
            l=mid+1;
          }
        }

        adj[q].push_back(col[w][mana]);
        adj[col[w][mana]].push_back(q);
        mul=mana+1;
        p.clear();
        for(int e=mul;e<col[w].size();e++)p.push_back(col[w][e]);
        p.push_back(q);
        brp=Query(p);
      }
    }
  }

  set<int>isi[2*N+1];
  for(int q=1;q<=2*N;q++){
    for(auto x : adj[q]){
      isi[q].insert(x);
    }
  }

  for(int q=1;q<=2*N;q++){
    if(isi[q].size()>1){
      for(int w=0;w<3;w++){
        vector<int>p;
        for(int e=0;e<3;e++){
          if(w!=e)p.push_back(adj[q][e]);
        }
        p.push_back(q);

        if(Query(p)==1){
          isi[q].erase(adj[q][w]);
          isi[adj[q][w]].erase(q);
        }
      }
    }
  }

  bool vis[2*N+1]; memset(vis,false,sizeof vis);
  for(int q=1;q<=2*N;q++){
    if(vis[q])continue;
    int apa=*isi[q].begin();
    vis[q]=vis[apa]=true;
    Answer(q,apa);
  }
  
}
#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...