Submission #944208

#TimeUsernameProblemLanguageResultExecution timeMemory
944208WansurSimurgh (IOI17_simurgh)C++14
51 / 100
341 ms14620 KiB
#include <bits/stdc++.h> #define f first #define s second #define ent '\n' typedef long long ll; using namespace std; struct asd{ int a, b, w, ca, cb; }; int count_common_roads(const std::vector<int>& r); int ask(vector<int> r){ return count_common_roads(r); } const string out[2]={"NO\n","YES\n"}; const ll dx[]={0,1,0,-1,-1,1,1,-1}; const ll dy[]={1,0,-1,0,-1,1,-1,1}; const int mod=998244353; const int md=1e9+7; const int mx=3e5+12; const bool T=0; vector<pair<int,int>> g[mx]; vector<vector<int>> ord; int col[505][505]; vector<int> vv,uu; bool used[mx]; bool taken[mx]; bool del[mx]; int was[mx]; int need[mx]; int p[mx]; vector<int> cur; int get(int x){ if(p[x]==x){ return x; } return p[x]=get(p[x]); } void check(vector<int> &cyc,int n){ int m=vv.size(); for(int i=0;i<n;i++){ p[i]=i; used[i]=0; } for(auto i:cyc){ used[vv[i]]=used[uu[i]]=1; p[get(vv[i])]=get(uu[i]); } vector<int> ost; for(int i=0;i<m;i++){ if(need[i]==-1){ continue; } if(get(vv[i])!=get(uu[i])){ p[get(vv[i])]=get(uu[i]); ost.push_back(i); } } vector<int> A; int mn=1e9,mx=-1e9; for(int i:cyc){ if(need[i]==1){ A.push_back(-1); continue; } vector<int> os; os=ost; for(int j:cyc){ if(i!=j){ os.push_back(j); } } int x=ask(os); mn=min(mn, x); mx=max(mx, x); A.push_back(x); } for(auto &x:A){ if(x==-1){ x=mn; } } if(mn==mx){ for(int i:cyc){ if(need[i]!=1)need[i]=-1; } return; } for(int l=0;l<cyc.size();l++){ int i=cyc[l]; if(A[l]==mx){ need[i]=-1; } else{ need[i]=1; } } } void dfs(int v,int p){ was[v]=1; cur.push_back(v); int cyc=-1; for(auto [to, i]:g[v]){ if(to==p || need[i]==-1)continue; if(was[to]==1 && !taken[to]){ cyc=to; } if(!was[to]){ dfs(to, v); } } if(cyc!=-1){ bool ok=0; int pos=cur.size()-1; for(int i=cur.size()-1;;i--){ if(taken[cur[i]]){ ok=1; } if(cur[i]==cyc){ pos=i; break; } } if(ok){ cur.pop_back(); was[v]=2; return; } vector<int> cc; for(int i=cur.size()-1;i>=pos;i--){ taken[cur[i]]=1; if(i>pos){ cc.push_back(col[cur[i]][cur[i-1]]); } } cc.push_back(col[v][cyc]); ord.push_back(cc); } cur.pop_back(); was[v]=2; } bool dec(int n,int m){ ord.clear(); cur.clear(); for(int i=0;i<n;i++){ was[i]=0; taken[i]=0; } for(int i=0;i<n;i++){ if(!was[i]){ dfs(i, -1); } } if(ord.size()==0){ return 0; } for(auto &cyc:ord){ check(cyc, n); } return 1; } vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v){ int m=u.size(); vv=v, uu=u; for(int i=0;i<m;i++){ g[v[i]].push_back({u[i], i}); g[u[i]].push_back({v[i], i}); col[v[i]][u[i]]=col[u[i]][v[i]]=i; } while(dec(n, m)); vector<int> ans; for(int i=0;i<n;i++){ p[i]=i; } for(int i=0;i<m;i++){ if(need[i]==1){ ans.push_back(i); p[get(v[i])]=get(u[i]); } } for(int i=0;i<m;i++){ if(get(v[i])!=get(u[i]) && need[i]!=-1){ ans.push_back(i); p[get(v[i])]=get(u[i]); } } return ans; }

Compilation message (stderr)

simurgh.cpp: In function 'void check(std::vector<int>&, int)':
simurgh.cpp:95:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int l=0;l<cyc.size();l++){
      |                 ~^~~~~~~~~~~
simurgh.cpp: In function 'void dfs(int, int)':
simurgh.cpp:110:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  110 |     for(auto [to, i]:g[v]){
      |              ^
#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...