Submission #834692

#TimeUsernameProblemLanguageResultExecution timeMemory
834692merlinSimurgh (IOI17_simurgh)C++14
0 / 100
1 ms212 KiB
#include<bits/stdc++.h> #include "simurgh.h" using namespace std; #define ll long long #define f first #define s second void setIO(string name="") { cin.tie(0)->sync_with_stdio(0); if (!name.empty()) { freopen((name+".in").c_str(), "r", stdin); freopen((name+".out").c_str(), "w", stdout); } } struct dsu{ vector<int> par; int comps; dsu(int n){ par = vector<int>(n,-1); comps = n; } int find(int a){ if(par[a] < 0) return a; par[a] = find(par[a]); return par[a]; } void merge(int a,int b){ a = find(a); b = find(b); if(a == b) return; comps--; if(par[a] > par[b]) swap(a,b); par[a] += par[b]; par[b] = a; } }; vector<vector<pair<int,pair<int,int>>>> sus; bool dfs(int cur,int par,int target,vector<int> &ret){ if(cur == target) return 1; for(auto i : sus[cur])if(i.s.s && i.f != par){ if(dfs(i.f,cur,target,ret)){ ret.push_back(i.s.f); return 1; } } return 0; } int ask(unordered_set<int> a){ vector<int> payload; for(auto i : a)payload.push_back(i); return count_common_roads(payload); } vector<int> find_roads(int n,vector<int> u,vector<int> v){ assert(n <= 240); int m = u.size(); vector<int> active(m,1); vector<int> ans; sus = vector<vector<pair<int,pair<int,int>>>>(n); vector<int> p_u,p_v; for(int i = 0;i<m;i++){ sus[u[i]].push_back({v[i],{i,0}}); sus[v[i]].push_back({u[i],{i,0}}); p_u.push_back(sus[u[i]].size()-1); p_v.push_back(sus[v[i]].size()-1); } while(ans.size() < n-1){ //for(auto i : ans)cerr<<i<<" ";cerr<<endl; dsu uf(n); vector<int> teraz = ans; for(auto i : ans){ uf.merge(u[i],v[i]); } int navyse = -1; for(int i = 0;i<m;i++)if(active[i]){ if(uf.find(u[i]) == uf.find(v[i])){ if(navyse == -1){ navyse = i; teraz.push_back(i); sus[u[i]][p_u[i]].s.s = 1; sus[v[i]][p_v[i]].s.s = 1; //cerr<<"navyse "<<i<<endl; } }else{ teraz.push_back(i); sus[u[i]][p_u[i]].s.s = 1; sus[v[i]][p_v[i]].s.s = 1; //cerr<<i<<endl; } uf.merge(u[i],v[i]); } if(navyse == -1) return teraz; vector<int> zaujimave; dfs(u[navyse],-1,v[navyse],zaujimave); zaujimave.push_back(navyse); //for(auto i : zaujimave) cerr<<i<<" ";cerr<<endl; unordered_set<int> payload; for(auto i : teraz) payload.insert(i); vector<int> anss; int low = 1<<30; for(auto i : zaujimave){ if(active[i]){ payload.erase(i); int tmp = ask(payload); low = min(low,tmp); anss.push_back(tmp); payload.insert(i); }else{ anss.push_back(-1); } } int low_num = 0; for(int i : anss)if(i <= low) low_num++; for(int i = 0;i<anss.size();i++){ if(low_num != anss.size() && anss[i] == low && active[zaujimave[i]]){ //cerr<<zaujimave[i]<<" dobra"<<endl; ans.push_back(zaujimave[i]); }else{ sus[u[zaujimave[i]]][p_u[zaujimave[i]]].s.s = 0; sus[v[zaujimave[i]]][p_v[zaujimave[i]]].s.s = 0; } active[zaujimave[i]] = 0; } } return ans; }

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:70:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   70 |     while(ans.size() < n-1){
      |           ~~~~~~~~~~~^~~~~
simurgh.cpp:117:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |         for(int i = 0;i<anss.size();i++){
      |                       ~^~~~~~~~~~~~
simurgh.cpp:118:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |             if(low_num != anss.size() && anss[i] == low && active[zaujimave[i]]){
      |                ~~~~~~~~^~~~~~~~~~~~~~
simurgh.cpp: In function 'void setIO(std::string)':
simurgh.cpp:11:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |   freopen((name+".in").c_str(), "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
simurgh.cpp:12:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |   freopen((name+".out").c_str(), "w", stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...