Submission #1025561

#TimeUsernameProblemLanguageResultExecution timeMemory
1025561huutuanSimurgh (IOI17_simurgh)C++14
51 / 100
149 ms2908 KiB
#include "simurgh.h"

#include <bits/stdc++.h>

using namespace std;

struct DSU{
   vector<int> lab;
   void init(int n){
      lab.assign(n, -1);
   }
   int find_set(int u){
      return lab[u]<0?u:lab[u]=find_set(lab[u]);
   }
   bool check(int u, int v){
      return find_set(u)==find_set(v);
   }
   void union_sets(int u, int v){
      u=find_set(u); v=find_set(v);
      if (u!=v){
         if (lab[u]>lab[v]) swap(u, v);
         lab[u]+=lab[v];
         lab[v]=u;
      }
   }
};

int query(vector<int> &v, int x){
   v.push_back(x);
   int ans=count_common_roads(v);
   v.pop_back();
   return ans;
}

vector<int> find_roads(int n, vector<int> u, vector<int> v) {
   int m=u.size();
   int cnt=0;
   vector<int> check(m, -1);
   for (int i=0; i<m; ++i) if (check[i]==-1){
      DSU dsu1, dsu2;
      dsu1.init(n); dsu2.init(n);
      vector<int> id;
      dsu1.union_sets(u[i], v[i]);
      for (int j=0; j<m; ++j) if (i!=j){
         if (!dsu1.check(u[j], v[j])){
            dsu1.union_sets(u[j], v[j]);
            dsu2.union_sets(u[j], v[j]);
            id.push_back(j);
         }
      }
      int val=query(id, i);
      int val0=-1;
      for (int j=0; j<m; ++j) if (i!=j){
         if (!dsu2.check(u[j], v[j])){
            if (check[j]!=-1 && val0==-1){
               val0=query(id, j)-check[j];
            }
         }
      }
      if (val0!=-1){
         check[i]=val-val0;
         for (int j=0; j<m; ++j) if (i!=j){
            if (!dsu2.check(u[j], v[j])){
               if (check[j]==-1){
                  check[j]=query(id, j)-val0;
               }
            }
         }
      }else{
         val0=val;
         vector<int> vv(m);
         for (int j=0; j<m; ++j) if (i!=j){
            if (!dsu2.check(u[j], v[j])){
               vv[j]=query(id, j);
               val0=max(val0, vv[j]);
            }
         }
         --val0;
         check[i]=val-val0;
         for (int j=0; j<m; ++j) if (i!=j){
            if (!dsu2.check(u[j], v[j])){
               check[j]=vv[j]-val0;
            }
         }
      }
   }
   vector<int> ans;
   for (int i=0; i<m; ++i) if (check[i]) ans.push_back(i);
   return ans;
}

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:37:8: warning: unused variable 'cnt' [-Wunused-variable]
   37 |    int cnt=0;
      |        ^~~
#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...