Submission #811252

#TimeUsernameProblemLanguageResultExecution timeMemory
811252penguinmanKeys (IOI21_keys)C++17
Compilation error
0 ms0 KiB
#include <vector> #include <bits/stdc++.h> using std::cin; using std::cout; using std::vector; using std::string; using ll = int; using vi = vector<ll>; using vii = vector<vi>; using pii = std::pair<ll,ll>; using std::endl; #define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++) #define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++) #define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--) #define ln "\n" #define pb emplace_back #define mp std::make_pair #define mtp std::make_tuple #define all(a) a.begin(),a.end() constexpr ll inf = (1ll<<60); struct directed_graph{ ll N; vii edge; vii revedge; vi par; vii member; directed_graph(ll n): N(n){ edge.resize(N); revedge.resize(N); } void add_edge(ll u, ll v){ edge[u].pb(v); revedge[v].pb(u); } vi ord, rev; vector<bool> flag; void dfs1(ll now){ flag[now] = true; for(auto next: edge[now]){ if(!flag[next]) dfs1(next); } ord.pb(now); } void dfs2(ll now, ll root){ rev[now] = root; for(auto next: revedge[now]){ if(rev[next] == -1) dfs2(next, root); } } vi SCC(){ flag.resize(N); rev.resize(N,-1); ll cnt = 0; rep(i,0,N){ if(!flag[i]) dfs1(i); } reverse(all(ord)); for(auto i: ord){ if(rev[i] == -1) dfs2(i, i); } return rev; } }; std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) { ll N = r.size(); vii edge(N), key(N); rep(i,0,u.size()){ edge[u[i]].pb(v[i]); edge[v[i]].pb(u[i]); key[u[i]].pb(c[i]); key[v[i]].pb(c[i]); } vi par(N); ll Rmax = *max_element(all(r))+1; vector<vector<bool>> obtained(N,vector<bool>(Rmax)); rep(i,0,N){ par[i] = i; obtained[i][r[i]] = true; } while(true){ directed_graph G(N); rep(i,0,N){ rep(j,0,edge[i].size()){ ll next = edge[i][j]; if(par[next] == par[i]) continue; if(!obtained[par[i]][key[i][j]]) continue; G.add_edge(par[i],par[next]); } } { vi v; vector<bool> flag(N); rep(i,0,N){ if(par[i] == i){ if(G.edge[i].empty()){ v.pb(i); flag[i] = true; } } } if(!v.empty()){ vi member(N); rep(i,0,N){ if(flag[par[i]]) member[par[i]]++; } ll min = inf; rep(i,0,N){ if(member[i]) min = std::min(min, member[i]); } vector<int> ans(N); rep(i,0,N){ if(member[par[i]] == min) ans[i] = 1; } return ans; } } par = G.SCC(); rep(i,0,N) obtained[par[i]][r[i]] = true; } } int main() { int n, m; assert(2 == scanf("%d%d", &n, &m)); std::vector<int> r(n), u(m), v(m), c(m); for(int i=0; i<n; i++) { assert(1 == scanf("%d", &r[i])); } for(int i=0; i<m; i++) { assert(3 == scanf("%d %d %d", &u[i], &v[i], &c[i])); } fclose(stdin); std::vector<int> ans = find_reachable(r, u, v, c); for (int i = 0; i < (int) ans.size(); ++i) { if(i) putchar(' '); putchar(ans[i]+'0'); } printf("\n"); return 0; }

Compilation message (stderr)

keys.cpp:24:24: warning: overflow in conversion from 'long long int' to 'll' {aka 'int'} changes value from '1152921504606846976' to '0' [-Woverflow]
   24 | constexpr ll inf = (1ll<<60);
      |                    ~~~~^~~~~
keys.cpp: In member function 'vi directed_graph::SCC()':
keys.cpp:58:6: warning: unused variable 'cnt' [-Wunused-variable]
   58 |   ll cnt = 0;
      |      ^~~
/usr/bin/ld: /tmp/ccLaD9Rd.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccF435tg.o:keys.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status