Submission #1190275

#TimeUsernameProblemLanguageResultExecution timeMemory
1190275Malix철인 이종 경기 (APIO18_duathlon)C++20
100 / 100
96 ms29256 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vii; typedef pair<int,int> pi; typedef vector<pi> pii; typedef tuple<ll,ll,ll> ti; typedef vector<ll> li; typedef vector<li> lii; #define REP(i,a,b) for(int i=a;i<b;i++) #define F first #define S second #define PB push_back #define LSOne(s) ((s)&(-s)) ll INF=1000000000000000010; int inf=1e9+10; ll M=1e9+7; int n,m,k,c=0; vii a,b; vi low,num; stack<int> st; ll ans=0; vector<ll> sz; void dfs(int x,int y){ st.push(x); low[x]=k;num[x]=k; k++; for(auto u:a[x])if(u!=y){ if(num[u]!=-1){ low[x]=min(low[x],num[u]); continue; } dfs(u,x); low[x]=min(low[x],low[u]); if(low[u]>=num[x]){ b[x].PB(n+c); while(b[n+c].empty()||b[n+c].back()!=u){ b[n+c].PB(st.top()); st.pop(); } c++; } } } void dfs2(int x){ if(x<n)sz[x]++; for(auto u:b[x]){ dfs2(u); sz[x]+=sz[u]; if(x>=n)ans-=b[x].size()*sz[u]*(sz[u]-1); } ll t=(ll)k-sz[x]; if(x>=n)ans-=b[x].size()*t*(t-1); } int main() { // ios::sync_with_stdio(0); // cin.tie(0); cin>>n>>m; a.resize(n);b.resize(2*n);sz.resize(2*n,0); REP(i,0,m){ int x,y;cin>>x>>y; x--;y--; a[x].PB(y); a[y].PB(x); } low.resize(n,-1);num.resize(n,-1); REP(i,0,n)if(num[i]==-1){ st=stack<int>(); k=0; dfs(i,-1); ans+=(ll)k*(k-1)*(k-2); dfs2(i); } cout<<ans; }
#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...