이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#pragma GCC optimize ("O2,unroll-loops")
//#pragma GCC optimize("no-stack-protector,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef pair<ll, ll> pll;
#define debug(x) cerr<<#x<<'='<<(x)<<endl;
#define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl;
#define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl;
#define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;}
#define all(x) x.begin(), x.end()
#define pb push_back
#define kill(x) return cout<<x<<'\n', 0;
const ld eps=1e-7;
const int inf=1000000010;
const ll INF=10000000000000010LL;
const int mod=1000000007;
const int MAXN=200010, LOG=20;
int n, m, k, u, v, x, y, t, a, b;
ll sz[MAXN], dp[MAXN], ans;
int par[MAXN], h[MAXN];
bool good[MAXN];
vector<int> G[MAXN], bcc;
vector<pii> E;
int dfs1(int node){
int res=h[node]=h[par[node]]+1;
bcc.pb(node);
for (int v:G[node]){
if (!h[v]) par[v]=node, res=min(res, dfs1(v));
else res=min(res, h[v]);
}
if (res==h[par[node]]){
while (1){
int v=bcc.back();
bcc.pop_back();
E.pb({node+n, v});
if (v==node) break ;
}
E.pb({node+n, par[node]});
}
if (!par[node]) bcc.pop_back();
return res;
}
void dfs2(int node){
sz[node]=(node<=n);
for (int v:G[node]) if (v!=par[node]){
par[v]=node;
dfs2(v);
sz[node]+=sz[v];
}
}
void dfs3(int node, ll ted){
dp[node]=(ted-2*(node<=n))*(ted-1)-(ted-sz[node])*(ted-sz[node]-1);
for (int v:G[node]) if (v!=par[node]) dp[node]-=sz[v]*(sz[v]-1);
for (int v:G[node]) if (v!=par[node]) dfs3(v, ted);
}
void dfs4(int node, ll ted){
if (node<=n){
ans+=dp[node];
// ll shit=ans;
for (int v:G[node]) if (v!=par[node]) ans+=dp[v]-2*sz[v]*(ted-sz[v]);
if (par[node]){
ans+=dp[par[node]];
ans-=2*sz[node]*(ted-sz[node]);
}
// debug2(node, ans-shit)
}
for (int v:G[node]) if (v!=par[node]) dfs4(v, ted);
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
cin>>n>>m;
while (m--){
cin>>u>>v;
G[u].pb(v);
G[v].pb(u);
}
for (int i=1; i<=n; i++){
if (!h[i]) dfs1(i);
G[i].clear();
par[i]=0;
}
for (pii p:E){
// debugp(p)
G[p.first].pb(p.second);
G[p.second].pb(p.first);
}
for (int i=1; i<=n; i++) if (!par[i]){
dfs2(i);
dfs3(i, sz[i]);
dfs4(i, sz[i]);
}
cout<<ans<<'\n';
// debug(dp[1])
// debug(dp[7])
return 0;
}
/*
4 3
1 2
2 3
3 4
4 4
1 2
2 3
3 4
4 2
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |