Submission #550953

#TimeUsernameProblemLanguageResultExecution timeMemory
550953600MihneaSplit the Attractions (IOI19_split)C++17
40 / 100
1595 ms28868 KiB
#include <bits/stdc++.h>
#include "split.h"

using namespace std;

///mt19937 rng((long long)(new char));
mt19937 rng(7777);

vector<int> solve(int n,vector<int> p, vector<int> q,int d1,int d2,double MAX_TIME){
  time_t bg=clock();
  assert((int)p.size()==(int)q.size());
  vector<pair<int, int>> edges((int)p.size());
  for(int i=0;i<(int)p.size();i++) {
    edges[i]={p[i], q[i]};
  }
  vector<int> sol(n,0);

  vector<vector<int>> g(n);

  vector<int> sub(n,0);

  bool ok=1;
  for(int i=0;i<(int)p.size();i++){
    g[p[i]].push_back(q[i]);
    g[q[i]].push_back(p[i]);
  }
  bool done=0;
  int need=0;
  function<void(int, int,int)>place_to_all=[&](int a,int p,int value){
    if(need==0) return;
    assert(need>0);
    sol[a]=value;
    need--;
    for(auto&b:g[a]){
      if(b!=p&&sol[b]==0){
        place_to_all(b,a,value);
      }
    }
  };
  function<void(int, int)>dfs=[&](int a,int p){
    assert(0<=a&&a<n);
   /// cout<<"a = "<<a<<" "<<p<<"\n";
    if(done) return;
    sub[a]=1;
    for(auto&b:g[a]){
      if(b!=p){
        dfs(b,a);
        if(done) return;
        sub[a]+=sub[b];
      }
    }
    if(done) return;
    if(sub[a]>=d1&&n-sub[a]>=d2){
      done=1;
      need=d1;
      place_to_all(a,p,1);
      assert(need==0);
      need=d2;
      assert(p!=-1);
      place_to_all(p,-1,2);
      assert(need==0);
      return;
    }
    if(sub[a]>=d2&&n-sub[a]>=d1){
      done=1;
      need=d2;
      place_to_all(a,p,2);
      assert(need==0);
      need=d1;
      assert(p!=-1);
      place_to_all(p,-1,1);
      assert(need==0);
      return;
    }
  };

  vector<int> t(n);

  function<int(int)>get_root=[&](int a){
    if(t[a]==a) return a;
    return t[a]=get_root(t[a]);
  };

  while((double)(clock()-bg)/CLOCKS_PER_SEC<MAX_TIME){ /// redo so to calculate the time fewer times
    int root=rng()%n;
    shuffle(edges.begin(),edges.end(),rng);
    for(int i=0;i<n;i++) g[i].clear(),t[i]=i;

    int uni=0;

    for(auto&it:edges){

      if(get_root(it.first)!=get_root(it.second)){
        uni++;
        t[get_root(it.first)]=get_root(it.second);
        g[it.first].push_back(it.second);
        g[it.second].push_back(it.first);
      }
    }
    assert(uni==n-1);

    dfs(root,-1);

    if(done){
      return sol;
    }
  }
  return {};
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<int> res;
  double TIME_EACH=0.5;
  vector<int> dims={a, b, c};

  for (int i=0;i<3;i++){
    for(int j=i+1;j<3;j++){
      auto sol=solve(n,p,q,dims[i],dims[j],TIME_EACH);
      if(sol.empty()) continue;
      int c1=0,c2=0;
      for (auto &it:sol){
        assert(it==0||it==1||it==2);
        c1+=(it==1);
        c2+=(it==2);
      }
      assert(c1==dims[i]);
      assert(c2==dims[j]);
      for (auto &it:sol){
        if(it==0){
          it=3-i-j;
        }else{
          if(it==1){
            it=i;
          }else{
            assert(it==2);
            it=j;
          }
        }
        it++;
        assert(1<=it&&it<=3);
      }
      return sol;
    }
  }
	return vector<int>(n,0);
}

Compilation message (stderr)

split.cpp: In function 'std::vector<int> solve(int, std::vector<int>, std::vector<int>, int, int, double)':
split.cpp:22:8: warning: unused variable 'ok' [-Wunused-variable]
   22 |   bool ok=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...