이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define pb emplace_back
using namespace std;
using ll = long long;
const int maxn = 300010;
int n, m;
vector<int> edge[maxn];
int low[maxn], st[maxn], stl, dep[maxn];
int cnt_b;
ll gsz;
vector<int> c[maxn];
bool is_ap[maxn];
ll res;
int h;
vector<int> tree_edge[maxn];
int sz[maxn];
void dfs2(int now, int last = 0){
sz[now] = c[now].size() + (now <= n);
for (int u : tree_edge[now]) if(u != last) {
dfs2(u, now);
sz[now] += sz[u] - 1;
}
ll cur = c[now].size();
if (now > n){
auto add = [&](ll sz){
return sz * cur * (gsz - sz-1) + (cur-1) * (cur-2) * sz;
return (sz) * (gsz-sz-1) * (cur) * 2;
};
for (int u : tree_edge[now]) if(u != last)
res += add(sz[u]-1);
if (last)
res += add(gsz-sz[now]);
res += cur * (cur-1) * (cur-2);
}
else {
//return;
for (int u : tree_edge[now]) if(u != last)
res -= (sz[u]-1) * (gsz-sz[u]);
if (last)
res -= (gsz-sz[now]) * (sz[now]-1);
}
}
void cal(){
for (int i = h;i < cnt_b;++i){
for (int u : c[i]) if (is_ap[u]) {
tree_edge[u].pb(i);
tree_edge[i].pb(u);
}
}
dfs2(h);
gsz = 0, h = cnt_b;
}
void dfs(int now, int last = 0){
static int d;
++gsz;
low[now] = dep[now] = ++d;
st[stl++] = now;
int cnt_c = 0;
for (int u : edge[now]) if (u != last) {
if (!low[u]){
dfs(u, now);
++cnt_c;
low[now] = min(low[now], low[u]);
if (low[u] >= dep[now]){
do {
c[cnt_b].pb( st[--stl] );
} while (st[stl] != u);
c[cnt_b++].pb(now);
is_ap[now] = true;
}
}
else
low[now] = min(low[now], dep[u]);
}
if (!last && cnt_c < 2)
is_ap[now] = false;
--d;
if (last == 0)
cal();
}
signed main(){
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
for ( int a, b, i = 0 ; i < m ; ++i) {
cin >> a >> b;
edge[a].pb(b);
edge[b].pb(a);
}
h = cnt_b = n+1;
for (int i = 1;i <= n;++i) if (!low[i])
dfs(i);
cout << res << '\n';
}
# | 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... |