#include<bits/stdc++.h>
#define pb emplace_back
#define AI(i) begin(i), end(i)
using namespace std;
using ll = long long;
#ifdef KEV
#define DE(args...) kout("[ " + string(#args) + " ] = ", args)
void kout() {cerr << endl;}
template<class T1, class ...T2>
void kout (T1 v, T2 ...e) { cerr << v << ' ', kout(e...); }
template<class T>
void debug(T L, T R) { while (L != R) cerr << *L << " \n"[next(L)==R], ++L; }
#else
#define DE(...) 0
#define debug(...) 0
#endif
const int MAX_N = 300010;
#define int ll
int n, m, low[MAX_N], dep[MAX_N], g[MAX_N], bcc, sz[MAX_N], dfscnt;
vector<int> edge[MAX_N], be[MAX_N], child[MAX_N];
bool isap[MAX_N];
void dfs1(int x, int lst = -1) {
++dfscnt;
static stack<int> st;
static int d;
st.push(x);
low[x] = dep[x] = ++d;
for (int u : edge[x]) if (u != lst) {
DE(x, u);
if (!low[u]) {
dfs1(u, x);
low[x] = min(low[x], low[u]);
if (low[u] >= dep[x]) {
isap[x] = true;
st.push(x);
int gid = ++bcc + n;
int tp = -1; do {
tp = st.top(); st.pop();
g[tp] = gid;
child[gid].pb(tp);
if (isap[tp]) {
be[gid].pb(tp), be[tp].pb(gid);
DE(tp, gid);
}
} while (tp != u);
}
}
else low[x] = min(low[x], dep[u]);
}
}
ll p2(ll v) { return v * (v-1); }
// count how many invalid triple there is
ll dfs2(int x, int m, int lst = -1) {
ll res = 0;
sz[x] = x <= n ? 1 : child[x].size();
for (int u : be[x]) if (u != lst)
res += dfs2(u, m, x), sz[x] += sz[u] - 1;
DE(x, sz[x]);
if (x <= n) {
ll all = p2(m-1);
// way is the number of valid triples
ll sum = m - sz[x], way = 0;
for (int u : be[x]) if (u != lst) {
way += (sz[u]-1) * sum * 2;
sum += (sz[u]-1);
ll cs = child[u].size() - 1;
way += p2(cs);
}
if (lst != -1)
way += p2(child[lst].size()-1);
//DE(x, all, way);
res += all - way;
}
else {
ll mid = 0, upsz = m - sz[x] + 1;
for (int u : child[x])
if (!isap[u]) ++mid;
for (int u : be[x]) if (u != lst) {
res += p2(sz[u]) * mid;
}
res += p2(upsz) * mid;
}
DE(res);
return res;
}
ll cal(int s) {
dfscnt = 0;
dfs1(s);
ll m = dfscnt;
return (m * (m-1) * (m-2)) - dfs2(s, m);
//return 0;
}
signed main() {
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
for (int i = 0, a, b;i < m;++i) {
cin >> a >> b;
edge[a].pb(b);
edge[b].pb(a);
}
ll res = 0;
for (int i = 1;i <= n;++i)
if (!dep[i])
res += cal(i);
cout << res << '\n';
}
Compilation message
count_triplets.cpp: In function 'void dfs1(ll, ll)':
count_triplets.cpp:14:17: warning: statement has no effect [-Wunused-value]
14 | #define DE(...) 0
| ^
count_triplets.cpp:29:3: note: in expansion of macro 'DE'
29 | DE(x, u);
| ^~
count_triplets.cpp:14:17: warning: statement has no effect [-Wunused-value]
14 | #define DE(...) 0
| ^
count_triplets.cpp:43:7: note: in expansion of macro 'DE'
43 | DE(tp, gid);
| ^~
count_triplets.cpp: In function 'll dfs2(ll, ll, ll)':
count_triplets.cpp:14:17: warning: statement has no effect [-Wunused-value]
14 | #define DE(...) 0
| ^
count_triplets.cpp:58:1: note: in expansion of macro 'DE'
58 | DE(x, sz[x]);
| ^~
count_triplets.cpp:14:17: warning: statement has no effect [-Wunused-value]
14 | #define DE(...) 0
| ^
count_triplets.cpp:85:2: note: in expansion of macro 'DE'
85 | DE(res);
| ^~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
21504 KB |
Output is correct |
2 |
Correct |
14 ms |
21504 KB |
Output is correct |
3 |
Correct |
15 ms |
21504 KB |
Output is correct |
4 |
Correct |
15 ms |
21504 KB |
Output is correct |
5 |
Correct |
16 ms |
21504 KB |
Output is correct |
6 |
Correct |
15 ms |
21504 KB |
Output is correct |
7 |
Incorrect |
15 ms |
21504 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
21504 KB |
Output is correct |
2 |
Correct |
14 ms |
21504 KB |
Output is correct |
3 |
Correct |
15 ms |
21504 KB |
Output is correct |
4 |
Correct |
15 ms |
21504 KB |
Output is correct |
5 |
Correct |
16 ms |
21504 KB |
Output is correct |
6 |
Correct |
15 ms |
21504 KB |
Output is correct |
7 |
Incorrect |
15 ms |
21504 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
97 ms |
38300 KB |
Output is correct |
2 |
Correct |
96 ms |
38172 KB |
Output is correct |
3 |
Correct |
130 ms |
41116 KB |
Output is correct |
4 |
Correct |
114 ms |
39280 KB |
Output is correct |
5 |
Correct |
117 ms |
36848 KB |
Output is correct |
6 |
Correct |
137 ms |
40304 KB |
Output is correct |
7 |
Correct |
146 ms |
38260 KB |
Output is correct |
8 |
Correct |
148 ms |
38904 KB |
Output is correct |
9 |
Correct |
137 ms |
36212 KB |
Output is correct |
10 |
Correct |
127 ms |
35960 KB |
Output is correct |
11 |
Correct |
111 ms |
33144 KB |
Output is correct |
12 |
Correct |
106 ms |
33024 KB |
Output is correct |
13 |
Correct |
102 ms |
32888 KB |
Output is correct |
14 |
Correct |
97 ms |
32632 KB |
Output is correct |
15 |
Correct |
76 ms |
31864 KB |
Output is correct |
16 |
Correct |
76 ms |
31608 KB |
Output is correct |
17 |
Correct |
20 ms |
25600 KB |
Output is correct |
18 |
Correct |
19 ms |
25472 KB |
Output is correct |
19 |
Correct |
20 ms |
25344 KB |
Output is correct |
20 |
Correct |
19 ms |
25344 KB |
Output is correct |
21 |
Correct |
19 ms |
25344 KB |
Output is correct |
22 |
Correct |
19 ms |
25216 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
21632 KB |
Output is correct |
2 |
Correct |
16 ms |
21632 KB |
Output is correct |
3 |
Correct |
16 ms |
21632 KB |
Output is correct |
4 |
Correct |
16 ms |
21760 KB |
Output is correct |
5 |
Correct |
15 ms |
21760 KB |
Output is correct |
6 |
Correct |
15 ms |
21760 KB |
Output is correct |
7 |
Correct |
15 ms |
21760 KB |
Output is correct |
8 |
Correct |
16 ms |
21760 KB |
Output is correct |
9 |
Correct |
15 ms |
21760 KB |
Output is correct |
10 |
Correct |
15 ms |
21632 KB |
Output is correct |
11 |
Correct |
15 ms |
21632 KB |
Output is correct |
12 |
Correct |
16 ms |
21760 KB |
Output is correct |
13 |
Correct |
16 ms |
21632 KB |
Output is correct |
14 |
Correct |
15 ms |
21632 KB |
Output is correct |
15 |
Correct |
15 ms |
21632 KB |
Output is correct |
16 |
Correct |
15 ms |
21632 KB |
Output is correct |
17 |
Correct |
15 ms |
21632 KB |
Output is correct |
18 |
Correct |
15 ms |
21632 KB |
Output is correct |
19 |
Correct |
15 ms |
21632 KB |
Output is correct |
20 |
Correct |
15 ms |
21632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
145 ms |
37652 KB |
Output is correct |
2 |
Correct |
149 ms |
37752 KB |
Output is correct |
3 |
Correct |
148 ms |
37764 KB |
Output is correct |
4 |
Correct |
147 ms |
37880 KB |
Output is correct |
5 |
Correct |
144 ms |
37624 KB |
Output is correct |
6 |
Correct |
175 ms |
48248 KB |
Output is correct |
7 |
Correct |
175 ms |
44920 KB |
Output is correct |
8 |
Correct |
170 ms |
43000 KB |
Output is correct |
9 |
Correct |
164 ms |
41208 KB |
Output is correct |
10 |
Correct |
150 ms |
37752 KB |
Output is correct |
11 |
Correct |
145 ms |
37732 KB |
Output is correct |
12 |
Correct |
147 ms |
37624 KB |
Output is correct |
13 |
Correct |
147 ms |
37624 KB |
Output is correct |
14 |
Correct |
139 ms |
36776 KB |
Output is correct |
15 |
Correct |
122 ms |
35704 KB |
Output is correct |
16 |
Correct |
78 ms |
32376 KB |
Output is correct |
17 |
Correct |
89 ms |
35560 KB |
Output is correct |
18 |
Correct |
88 ms |
35560 KB |
Output is correct |
19 |
Correct |
94 ms |
35928 KB |
Output is correct |
20 |
Correct |
92 ms |
35688 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
21632 KB |
Output is correct |
2 |
Correct |
16 ms |
21632 KB |
Output is correct |
3 |
Incorrect |
16 ms |
21632 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
151 ms |
37752 KB |
Output is correct |
2 |
Correct |
155 ms |
37752 KB |
Output is correct |
3 |
Incorrect |
162 ms |
36856 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
21504 KB |
Output is correct |
2 |
Correct |
14 ms |
21504 KB |
Output is correct |
3 |
Correct |
15 ms |
21504 KB |
Output is correct |
4 |
Correct |
15 ms |
21504 KB |
Output is correct |
5 |
Correct |
16 ms |
21504 KB |
Output is correct |
6 |
Correct |
15 ms |
21504 KB |
Output is correct |
7 |
Incorrect |
15 ms |
21504 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
21504 KB |
Output is correct |
2 |
Correct |
14 ms |
21504 KB |
Output is correct |
3 |
Correct |
15 ms |
21504 KB |
Output is correct |
4 |
Correct |
15 ms |
21504 KB |
Output is correct |
5 |
Correct |
16 ms |
21504 KB |
Output is correct |
6 |
Correct |
15 ms |
21504 KB |
Output is correct |
7 |
Incorrect |
15 ms |
21504 KB |
Output isn't correct |
8 |
Halted |
0 ms |
0 KB |
- |