Submission #235980

#TimeUsernameProblemLanguageResultExecution timeMemory
235980DodgeBallManDuathlon (APIO18_duathlon)C++14
100 / 100
194 ms26152 KiB
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 10; int n, m, pre[N], low[N], subsz[N], compsz[N]; long long ans; bool art[N]; vector<vector<int>> g(N), ccs; void tarjan( int u, int p ) { static int ti = 0; static stack<int> s; int chk = 0; low[u] = pre[u] = ++ti; s.emplace( u ); for( int v : g[u] ) if( !pre[v] ) { tarjan( v, u ); chk++; low[u] = min( low[u], low[v] ); if( !p && chk > 1 || p && low[v] >= pre[u] ) art[u] = true; if( low[v] >= pre[u] ) { ccs.emplace_back( vector<int>() ); ccs.back().emplace_back( u ); while( ccs.back().back() != v ) ccs.back().emplace_back( s.top() ), s.pop(); } } else if( v != p ) low[u] = min( low[u], pre[v] ); } void genbcc() { g.clear(), g.resize( n+1 ); for( vector<int> &cc : ccs ) { g.emplace_back( vector<int>() ); compsz[(int)g.size()-1] = cc.size(); for( int u : cc ) g[u].emplace_back( ( int )g.size() - 1 ), g[(int)g.size() - 1].emplace_back( u ); } } int getsz( int u, int p ) { if( u <= n ) subsz[u] = 1; for( int v : g[u] ) if( v != p ) subsz[u] += getsz( v, u ); return subsz[u]; } void bad( int u, int p, int all ) { //printf("%d %d\n",u,p); if( u <= n ) for( int v : g[u] ) { if( v != p ) ans -= 1ll * ( compsz[v] - 1 ) * ( all - subsz[v] ) * ( all - subsz[v] - 1 ); else ans -= 1ll * ( compsz[v] - 1 ) * subsz[u] * ( subsz[u] - 1 ); } for( int v : g[u] ) if( v != p ) bad( v, u, all ); } int main() { scanf("%d %d",&n,&m); for( int i = 0, a, b ; i < m ; i++ ) { scanf("%d %d",&a,&b); g[a].emplace_back( b ), g[b].emplace_back( a ); } for( int i = 1 ; i <= n ; i++ ) if( !pre[i] ) tarjan( i, 0 ); genbcc(); for( int i = 1 ; i <= n ; i++ ) if( !subsz[i] ) { getsz( i, 0 ); //printf("%d\n",subsz[i]); ans += 1ll * subsz[i] * ( subsz[i] - 1 ) * ( subsz[i] - 2 ); bad( i, 0, subsz[i] ); } printf("%lld",ans); return 0; }

Compilation message (stderr)

count_triplets.cpp: In function 'void tarjan(int, int)':
count_triplets.cpp:21:16: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
         if( !p && chk > 1 || p && low[v] >= pre[u] ) art[u] = true;
             ~~~^~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&n,&m);
     ~~~~~^~~~~~~~~~~~~~~
count_triplets.cpp:60:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d",&a,&b);
         ~~~~~^~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...