Submission #300948

#TimeUsernameProblemLanguageResultExecution timeMemory
300948pacha2880Simurgh (IOI17_simurgh)C++17
30 / 100
258 ms4728 KiB
#include <bits/stdc++.h> #include "simurgh.h" //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #define mp make_pair #define pb push_back #define all(a) (a).begin(), (a).end() #define sz(a) a.size() #define md(a, b) ((a) % b + b) % b #define mod(a) md(a, MOD) #define srt(a) sort(all(a)) #define mem(a, h) memset(a, (h), sizeof(a)) #define f first #define s second #define forn(i, n) for(int i = 0; i < n; i++) #define fore(i, b, e) for(int i = b; i < e; i++) #define forg(i, b, e, m) for(int i = b; i < e; i+=m) //int in(){int r=0,c;for(c=getchar();c<=32;c=getchar());if(c=='-') return -in();for(;c>32;r=(r<<1)+(r<<3)+c-'0',c=getchar());return r;} using namespace std; //using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int, int> ii; typedef vector<int> vi; typedef vector<ii> vii; typedef vector<ll> vll; //typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; //find_by_order kth largest order_of_key < const int tam = 550; const int MOD = 1000000007; const int MOD1 = 998244353; const double EPS = 1e-9; const double PI = acos(-1); vector<pair<int, int>> g[tam]; vector<pair<int, int>> ng[tam]; vector<int> r; int parent[tam * tam]; int color[tam * tam]; bool visited[tam], used[tam * tam], vasited[tam * tam]; int poso[tam * tam]; int con = 0; int n, m; void dfs0(int node) { visited[node] = 1; fore(i, 0, g[node].size()) { if(!visited[g[node][i].f]) { r.pb(g[node][i].s); used[g[node][i].s] = 1; poso[g[node][i].s] = r.size() - 1; ng[node].pb(g[node][i]); ng[g[node][i].f].pb({node, g[node][i].s}); dfs0(g[node][i].f); } } } int find(int n) { if(parent[n] == -1) return n; return parent[n] = find(parent[n]); } vector<int> res; bool cicl(int node, int par) { visited[node] = 1; //cout<<node<<'\n'; for(auto cat : ng[node]) { if(!visited[cat.f]) { if(cicl(cat.f, node)) { //cout<<"++++++ "<<node<<' '<<cat.f<<' '<<cat.s<<'\n'; res.pb(cat.s); return true; } } else if(cat.f != par) { //cout<<"====== "<<node<<' '<<cat.f<<' '<<cat.s<<'\n'; res.pb(cat.s); return true; } } return false; } vector<int> find_roads(int nn, vector<int> u, vector<int> v) { n = nn; m = u.size(); fore(i, 0, m) { g[u[i]].pb({v[i], i}); g[v[i]].pb({u[i], i}); } dfs0(0); int x = count_common_roads(r), y, a, b; if(x == n - 1) return r; //cout<<r.size()<<' '<<x<<'\n'; /*fore(i, 0, r.size()) { cout<<r[i]<<','<<poso[r[i]]<<" "; } cout<<'\n';*/ int remp; int cont, sel; mem(parent, -1); bool bon; fore(i, 0, m) { if(!used[i]) { //cout<<i<<' '<<v[i]<<' '<<u[i]<<'\n'; ng[u[i]].pb({v[i], i}); ng[v[i]].pb({u[i], i}); fore(i, 0, n) visited[i] = 0; res.clear(); cicl(u[i], -1); ng[u[i]].pop_back(); ng[v[i]].pop_back(); vasited[i] = 1; cont = 0; //cout<<res.size()<<'\n'; //cout<<"mi ciclo "<<res[0]<<'\n'; bon = false; fore(j, 1, res.size()) { //cout<<res[j]<<','<<poso[res[j]]<<','<<r[poso[res[j]]]<<' '; remp = res[j]; if(vasited[remp]) sel = remp; else { r[poso[remp]] = i; y = count_common_roads(r); if(y == x) { cont++; a = find(i); b = find(remp); if(a != b) { if(color[a] == 0) color[a] = color[b]; parent[a] = b; } } else if(y == x + 1) { bon = true; color[find(i)] = 1; color[find(remp)] = -1; } else { bon = true; color[find(i)] = -1; color[find(remp)] = 1; } r[poso[remp]] = remp; } vasited[remp] = 1; } //cout<<"\n\n"; if(cont == res.size() - 1) color[find(i)] = -1; else if(!bon) { remp = sel; r[poso[remp]] = i; y = count_common_roads(r); if(y == x) { a = find(i); b = find(remp); if(a != b) { if(color[a] == 0) color[a] = color[b]; parent[a] = b; } } else if(y == x + 1) { bon = true; color[find(i)] = 1; color[find(remp)] = -1; } else { bon = true; color[find(i)] = -1; color[find(remp)] = 1; } r[poso[remp]] = remp; } } } //cout<<"hola\n"; r.clear(); fore(i, 0, m) { color[i] = color[find(i)]; //cout<<u[i]<<'-'<<v[i]<<' '<<i<<" color -> "<<color[i]<<'\n'; if(color[i] >= 0) { color[i] = 1; //cout<<i<<'\n'; r.pb(i); } //cout<<u[i]<<'-'<<v[i]<<' '<<i<<" color -> "<<color[i]<<'\n'; } //cout<<"cocacola\n"; return r; }

Compilation message (stderr)

simurgh.cpp: In function 'void dfs0(int)':
simurgh.cpp:16:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 | #define fore(i, b, e) for(int i = b; i < e; i++)
......
   49 |  fore(i, 0, g[node].size())
      |       ~~~~~~~~~~~~~~~~~~~~              
simurgh.cpp:49:2: note: in expansion of macro 'fore'
   49 |  fore(i, 0, g[node].size())
      |  ^~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:16:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 | #define fore(i, b, e) for(int i = b; i < e; i++)
......
  130 |    fore(j, 1, res.size())
      |         ~~~~~~~~~~~~~~~~                
simurgh.cpp:130:4: note: in expansion of macro 'fore'
  130 |    fore(j, 1, res.size())
      |    ^~~~
simurgh.cpp:169:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  169 |    if(cont == res.size() - 1)
      |       ~~~~~^~~~~~~~~~~~~~~~~
simurgh.cpp:64:13: warning: 'sel' may be used uninitialized in this function [-Wmaybe-uninitialized]
   64 |  if(parent[n] == -1) return n;
      |     ~~~~~~~~^
simurgh.cpp:110:12: note: 'sel' was declared here
  110 |  int cont, sel;
      |            ^~~
#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...