// author : sentheta aka vanwij
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cassert>
#include<random>
#include<chrono>
#include<cmath>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define Int long long
#define V vector
#define pii pair<int,int>
#define ff first
#define ss second
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define pow2(x) (1LL<<(x))
#define msb(x) (63-__builtin_clzll(x))
#define bitcnt(x) (__builtin_popcountll(x))
#define nl '\n'
#define _ << ' ' <<
#define all(x) (x).begin(), (x).end()
#define rep(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define dbg(x) if(0) cout << "?" << #x << " : " << (x) << endl << flush;
#define int long long
// const Int MOD = 1e9+7;
const Int MOD = 998244353;
Int bpow(Int a,Int b){
Int ret = 1;
for(;b; a=a*a%MOD,b/=2) if(b&1) ret = ret*a%MOD;
return ret;
}
Int inv(Int a){return bpow(a,MOD-2);}
void solve(); int TC, ALLTC;
signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
srand(chrono::steady_clock::now().time_since_epoch().count());
cout << fixed << setprecision(7);
// cin >> ALLTC; for(TC=1; TC<=ALLTC; TC++) solve(); return 0;
solve();
}
const int N = 1e5+5;
const int M = 2e5+5;
int n, m;
pii edg[M];
V<int> adj[N];
bool bg[M];
int t[N], up[N], tim=0;
void dfs_bridge(int x=1,int par=-1){
up[x] = t[x] = ++tim;
for(int e : adj[x]){
int y = edg[e].ff^edg[e].ss^x;
if(y==par) continue;
if(t[y]==-1){
dfs_bridge(y, x);
}
up[x] = min(up[x],up[y]);
if(up[y] > t[x]){
bg[e] = 1;
// cout << x _ y << nl;
}
}
}
int sz[N];
struct Dsu{
int p[N];
Dsu(){
reset();
}
void reset(){
rep(i,0,N) p[i]=i, sz[i]=1;
}
int find(int x){
return p[x]==x ? x : p[x]=find(p[x]);
}
void unite(int x,int y){
if((x=find(x))==(y=find(y))) return;
p[y] = x;
sz[x] += sz[y];
}
} dsu;
V<int> cadj[N];
int ans = 0;
void dfs_dp(int x,int par=-1){
int orisz = sz[x];
for(int y : cadj[x]) if(y!=par){
dfs_dp(y, x);
sz[x] += sz[y];
}
dbg(x);
dbg(orisz);
dbg(sz[x]);
// S,C,T in this component
ans += orisz *(orisz-1) *(orisz-2);
dbg(orisz *(orisz-1) *(orisz-2));
// S,C in this component
// C,T in this component
// if C is entry point
ans += 2 *(orisz-1) *1 *(n-orisz);
// if C is not entry point
ans += 2 *(orisz-2) *(orisz-1) *(n-orisz);
// dbg(2 *(orisz-1) *(orisz-1) *(n-orisz));
// C is LCA
// C in this component, S from a child, T from other child
for(int y : cadj[x]) if(y!=par){
ans += orisz *sz[y] *(sz[x]-1-sz[y]);
dbg(orisz *sz[y] *(sz[x]-1-sz[y]));
}
// C is not LCA
// C in this component, S from a child, T from parent
// C in this component, T from a child, C from parent
ans += 2 *orisz *(sz[x]-orisz) *(n-sz[x]);
dbg(2 *orisz *(sz[x]-orisz) *(n-sz[x]));
dbg(ans);
// cout << nl;
}
void solve(){
cin >> n >> m;
rep(e,1,m+1){
int u, v;
cin >> u >> v;
edg[e] = {u,v};
adj[u].push_back(e);
adj[v].push_back(e);
}
rep(i,1,n+1) t[i] = -1;
dfs_bridge();
rep(e,1,m+1) if(!bg[e]){
auto[x,y] = edg[e];
dsu.unite(x,y);
}
rep(e,1,m+1) if(bg[e]){
auto[x,y] = edg[e];
x = dsu.find(x);
y = dsu.find(y);
cadj[x].push_back(y);
cadj[y].push_back(x);
}
dfs_dp(dsu.find(1));
cout << ans << nl;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
6612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
6612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
90 ms |
20796 KB |
Output is correct |
2 |
Correct |
87 ms |
20716 KB |
Output is correct |
3 |
Incorrect |
85 ms |
16776 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
6612 KB |
Output is correct |
2 |
Correct |
5 ms |
6608 KB |
Output is correct |
3 |
Correct |
4 ms |
6612 KB |
Output is correct |
4 |
Correct |
6 ms |
6764 KB |
Output is correct |
5 |
Correct |
4 ms |
6740 KB |
Output is correct |
6 |
Correct |
4 ms |
6744 KB |
Output is correct |
7 |
Correct |
6 ms |
6740 KB |
Output is correct |
8 |
Correct |
6 ms |
6740 KB |
Output is correct |
9 |
Correct |
5 ms |
6740 KB |
Output is correct |
10 |
Incorrect |
4 ms |
6616 KB |
Output isn't correct |
11 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
103 ms |
17304 KB |
Output is correct |
2 |
Correct |
107 ms |
17432 KB |
Output is correct |
3 |
Correct |
98 ms |
17396 KB |
Output is correct |
4 |
Correct |
96 ms |
17352 KB |
Output is correct |
5 |
Correct |
107 ms |
17356 KB |
Output is correct |
6 |
Correct |
145 ms |
20420 KB |
Output is correct |
7 |
Correct |
132 ms |
19916 KB |
Output is correct |
8 |
Correct |
128 ms |
19172 KB |
Output is correct |
9 |
Correct |
137 ms |
18452 KB |
Output is correct |
10 |
Incorrect |
96 ms |
15788 KB |
Output isn't correct |
11 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
6608 KB |
Output is correct |
2 |
Correct |
5 ms |
6608 KB |
Output is correct |
3 |
Incorrect |
6 ms |
6608 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
103 ms |
17392 KB |
Output is correct |
2 |
Correct |
130 ms |
17144 KB |
Output is correct |
3 |
Incorrect |
113 ms |
16480 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
6612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
6612 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |