Submission #1304408

#TimeUsernameProblemLanguageResultExecution timeMemory
1304408_TemirhanDrivers (BOI24_drivers)C++20
100 / 100
380 ms156908 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #if defined(__GNUC__) || defined(__clang__) #pragma GCC optimize("Ofast,unroll-loops,inline-functions,no-stack-protector") #pragma GCC target("avx2,fma,tune=native") #pragma clang loop vectorize(enable) #pragma clang loop interleave(enable) #endif #define int long long #define sz(x) (int)x.size() #define F first #define S second #define pb push_back #define nl '\n' #define o_set tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef pair<int, int> pii; void file( string s = "" ) { if( s.empty() ) return; freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } const int N = 2e5 + 2; const int N1 = 1e6 + 2; const int inf = 1e9 + 2; const int INF = 1e18 + 2; const int mod = 1e9 + 7; int T = 1, n, m, q, p[N], sz[N], up[N][20], mx[N][20], tin[N], tout[N], timer, us[N]; vector< pii > g[N]; vector< array<int, 3> > qr[N]; string ans[N]; int root( int v ) { return v == p[v] ? v : p[v] = root(p[v]); } int merge( int u, int v ) { u = root(u); v = root(v); if( u == v ) return 0; if( sz[u] < sz[v] ) swap(u, v); p[v] = u; sz[u] += sz[v]; return 1; } void calc( int v, int pr, int lw ) { us[v] = 1; tin[v] = ++timer; up[v][0] = pr; mx[v][0] = lw; for( int k = 1; k < 20; ++k ) { up[v][k] = up[up[v][k - 1]][k - 1]; mx[v][k] = max(mx[v][k - 1], mx[up[v][k - 1]][k - 1]); } for( auto [to, w]: g[v] ) if( to != pr ) calc(to, v, w); tout[v] = timer; } int ch( int u, int v ) { return tin[u] <= tin[v] && tout[v] <= tout[u]; } int lca( int u, int v ) { if( ch(u, v) ) return u; if( ch(v, u) ) return v; for( int i = 19; i >= 0; --i ) if( !ch(up[u][i], v) ) u = up[u][i]; return up[u][0]; } int fmx( int u, int v ) { if( u == v ) return 0; int res = 0; for( int i = 19; i >= 0; --i ) if( !ch(up[v][i], u) ) { res = max(res, mx[v][i]); v = up[v][i]; } return max(res, mx[v][0]); } void dfs( int v, int pr ) { for( auto [u, w, id]: qr[v] ) if( sz(ans[id]) == 0 ) { if( root(u) != root(v) ) ans[id] = "NE"; else { int l = lca(u, v); ans[id] = (max(fmx(l, u), fmx(l, v)) <= w ? "TAIP" : "NE"); } } for( auto [to, w]: g[v] ) if( to != pr ) dfs(to, v); } void solve() { cin >>n >>m >>q; for( int i = 1; i <= n; ++i ) p[i] = i, sz[i] = 1; vector< array<int, 3> > vec; for( int i = 1, u, v, w; i <= m; ++i ) { cin >>u >>v >>w; vec.pb({w, u, v}); } sort(vec.begin(), vec.end()); for( auto [w, u, v]: vec ) if( merge(u, v) ) { g[u].pb({v, w}); g[v].pb({u, w}); } for( int i = 1, u, v, w; i <= q; ++i ) { ans[i] = ""; cin >>u >>v >>w; qr[u].pb({v, w, i}); qr[v].pb({u, w, i}); } for( int i = 1; i <= n; ++i ) if( !us[i] ) { calc(i, i, 0); dfs(i, i); } for( int i = 1; i <= q; ++i ) cout <<ans[i] <<nl; } signed main() { file(""); ios_base::sync_with_stdio(false); cin.tie(nullptr); // cin >>T; while( T-- ) solve(); }

Compilation message (stderr)

Main.cpp: In function 'void file(std::string)':
Main.cpp:29:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   29 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:30:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     freopen((s + ".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...