제출 #637372

#제출 시각아이디문제언어결과실행 시간메모리
637372Fidan수천개의 섬 (IOI22_islands)C++17
55 / 100
47 ms13644 KiB
#include <bits/stdc++.h> #include <variant> #include "islands.h" using namespace std; typedef int ll; void dfs1(ll k, vector<vector<pair<ll, ll>>> &g, vector<bool> &used){ if(used[k]) return; used[k]=true; for(ll i=0; i<g[k].size(); i++){ dfs1(g[k][i].first, g, used); } } vector<ll> s; vector<ll> color; int dfs(ll k, vector<vector<ll>> &g, vector<bool> &used){ color[k]=1; s.push_back(k); for(ll i: g[k]){ if(color[i]==0){ int d=dfs(i, g, used); if(d!=-1){ return d; } } else if(color[i]==1){ return i; } } s.pop_back(); color[k]=2; return -1; } variant<bool, vector<int>> find_journey(int n, int m, vector<int> u, vector<int> v){ bool bo=true; if(m%2==1) bo=false; if(bo){ for(ll i=0; i<m; i+=2){ if(u[i]!=v[i+1] || u[i+1]!=v[i]) bo=false; } } if(n==2){ ll a=-1, b=-1, c=-1; for(ll i=0; i<m; i++){ if(u[i]==0){ if(a==-1) a=i; else b=i; } else c=i; } if(b==-1 || c==-1) return false; return vector<int>({a, c, b, a, c, b}); } else if(m==n*(n-1)){ ll a=-1, b=-1, c=-1, d=-1, e=-1, f=-1; for(ll i=0; i<m; i++){ if(u[i]==0 && v[i]==1) a=i; if(u[i]==1 && v[i]==0) b=i; if(u[i]==1 && v[i]==2) c=i; if(u[i]==2 && v[i]==1) d=i; if(u[i]==2 && v[i]==0) e=i; if(u[i]==0 && v[i]==2) f=i; } return vector<int>({a, c, e, f, d, b, e, c, a, b, d, f}); } else if(bo){ vector<vector<pair<ll, ll>>> g(n); vector<ll> res, res1; for(ll i=0; i<m; i++){ g[u[i]].push_back({v[i], i}); } if(g[0].size()>=2){ ll a=g[0][0].second, b=g[0][1].second; ll a1, b1; if(a%2==0) a1=a+1; else a1=a-1; if(b%2==0) b1=b+1; else b1=b-1; return vector<int>({a, a1, b, b1, a1, a, b1, b}); } else{ bool f=false; vector<bool> used(n); dfs1(0, g, used); for(ll i=0; i<n; i++){ if(used[i] && g[i].size()>=3) f=true; } if(!f) return false; ll l=g[0][0].first, k=0; res1.push_back(g[0][0].second); res.push_back(g[0][0].second); while(g[l].size()<3){ if(g[l][0].first==k){ res1.push_back(g[l][1].second); res.push_back(g[l][1].second); k=l; l=g[l][1].first; } else{ res1.push_back(g[l][0].second); res.push_back(g[l][0].second); k=l; l=g[l][0].first; } } ll a=-1, b=-1; for(ll i=0; i<3; i++){ if(g[l][i].first!=k){ if(a==-1) a=g[l][i].second; else b=g[l][i].second; } } ll a1, b1; if(a%2==0) a1=a+1; else a1=a-1; if(b%2==0) b1=b+1; else b1=b-1; res.push_back(a); res.push_back(a1); res.push_back(b); res.push_back(b1); res.push_back(a1); res.push_back(a); res.push_back(b1); res.push_back(b); reverse(res1.begin(), res1.end()); for(ll asdf:res1) res.push_back(asdf); return res; } } else{ vector<vector<ll>> g(n); color.resize(n); vector<vector<pair<ll, ll>>> gr(n, vector<pair<ll, ll>> (n, {-1, -1})); for(ll i=0; i<m; i++){ g[u[i]].push_back(v[i]); if(gr[u[i]][v[i]].first==-1) gr[u[i]][v[i]].first=i; else gr[u[i]][v[i]].second=i; } vector<bool> used(n, false); int f=dfs(0, g, used); if(f==-1) return false; s.push_back(f); ll qw=s.size(); vector<ll> to, c; ll l=0; for(ll i=0; i<qw; i++){ to.push_back(s[i]); l=i; if(s[i]==s[qw-1]) break; } for(ll i=l; i<qw; i++){ c.push_back(s[i]); } vector<ll> res; for(ll i=0; i<to.size()-1; i++){ res.push_back(gr[to[i]][to[i+1]].first); } for(ll i=0; i<c.size()-1; i++){ res.push_back(gr[c[i]][c[i+1]].first); } for(ll i=0; i<c.size()-1; i++){ res.push_back(gr[c[i]][c[i+1]].second); } for(ll i=c.size()-2; i>=0; i--){ res.push_back(gr[c[i]][c[i+1]].first); } for(ll i=c.size()-2; i>=0; i--){ res.push_back(gr[c[i]][c[i+1]].second); } for(ll i=to.size()-2; i>=0; i--){ res.push_back(gr[to[i]][to[i+1]].first); } return res; } }

컴파일 시 표준 에러 (stderr) 메시지

islands.cpp: In function 'void dfs1(ll, std::vector<std::vector<std::pair<int, int> > >&, std::vector<bool>&)':
islands.cpp:9:15: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    9 |  for(ll i=0; i<g[k].size(); i++){
      |              ~^~~~~~~~~~~~
islands.cpp: In function 'std::variant<bool, std::vector<int, std::allocator<int> > > find_journey(int, int, std::vector<int>, std::vector<int>)':
islands.cpp:155:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  155 |   for(ll i=0; i<to.size()-1; i++){
      |               ~^~~~~~~~~~~~
islands.cpp:158:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  158 |   for(ll i=0; i<c.size()-1; i++){
      |               ~^~~~~~~~~~~
islands.cpp:161:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  161 |   for(ll i=0; i<c.size()-1; i++){
      |               ~^~~~~~~~~~~
#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...