This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#define ll long long
#define vi vector<int>
#define pii pair<int, int>
#define fst first
#define snd second
using namespace std;
int N, M;
vi adj[100001];
int vis[100001], low[100001], idx = 0, tp[100001], sz[200001];
bool isArc[100001];
vi stack;
vector<vi> comp;
bool done[200001];
vi tree[200001];
ll DP[200001][2], temp[200001][2], res = 0;
void DFS(int u, int p)
{
vis[u] = low[u] = idx++;
stack.push_back(u);
for (auto v : adj[u])
{
if (vis[v] == -1)
{
DFS(v, u);
low[u] = min(low[u], low[v]);
if (low[v] >= vis[u])
{
isArc[u] = (vis[u] > 0 || vis[v] > 1);
comp.push_back({u});
while (comp.back().back() != v)
{
comp.back().push_back(stack.back());
stack.pop_back();
}
}
}
else if (v != p) low[u] = min(low[u], vis[v]);
}
}
inline int buildBCT()
{
int cnt = 0;
for (int i = 0; i < N; i++)
{
if (isArc[i]) {tp[i] = cnt; sz[cnt++] = 1;}
}
for (const auto &v : comp)
{
for (const auto &x : v)
{
if (isArc[x])
{
tree[tp[x]].push_back(cnt);
tree[cnt].push_back(tp[x]);
}
}
sz[cnt++] = v.size();
}
return cnt;
}
void DFST(int u, int p)
{
if (done[u]) {return;}
done[u] = 1;
for (auto v : tree[u])
{
if (v != p)
{
DFST(v, u);
DP[u][0] += DP[v][0];
DP[u][1] += DP[v][1];
}
}
if (sz[u] == 1)
{
DP[u][1] -= DP[u][0]; DP[u][0]++;
temp[u][0] = 1; temp[u][1] = 0;
for (auto v : tree[u])
{
if (v != p) {temp[v][1] = DP[v][1] - DP[v][0];}
}
}
else
{
ll S = sz[u] - tree[u].size();
res += S * (S - 1) * (S - 2);
res += tree[u].size() * S * (S - 1);
DP[u][0] += S; DP[u][1] += sz[u] * DP[u][0];
temp[u][0] = S; temp[u][1] = sz[u] * S;
for (auto v : tree[u])
{
if (v != p) {temp[v][1] = DP[v][1] + sz[u] * DP[v][0];}
}
}
for (auto v : tree[u])
{
if (v != p)
{
res += (DP[u][1] - temp[v][1]) * DP[v][0] + (DP[u][0] - DP[v][0]) * DP[v][1] - 2 * DP[v][0] * (DP[u][0] - DP[v][0]);
res += temp[u][1] * DP[v][0] + temp[u][0] * DP[v][1] - 2 * DP[v][0] * temp[u][0];
}
}
}
int32_t main()
{
ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N >> M;
for (int i = 0; i < N; i++) {vis[i] = -1;}
for (int i = 0; i < M; i++)
{
int u, v; cin >> u >> v;
adj[u - 1].push_back(v - 1);
adj[v - 1].push_back(u - 1);
}
for (int i = 0; i < N; i++)
{
if (vis[i] == -1) {DFS(i, -1);}
}
N = buildBCT();
for (int i = 0; i < N; i++)
{
if (sz[i] > 1)
{
DFST(i, -1);
}
}
cout << res << "\n";
return 0;
}
# | 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... |