이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
///
/// I have a dream and a piano
///
#define _USE_MATH_DEFINES
#define FAST ios::sync_with_stdio(false),cin.tie(0);
#include <bits/stdc++.h>
#define Loop(x, l, r) for(int x = (l); x < (r); ++x)
#define LoopR(x, l, r) for(int x = (r)-1; x >= (l); --x)
#define all(x) x.begin(), x.end()
#define Kill(x) exit((cout << (x) << '\n', 0))
#define YN(flag) ((flag)? "YES": "NO")
#define F first
#define S second
typedef long long ll;
typedef unsigned long long ull;
typedef std::pair<int,int> pii;
typedef std::pair<ll ,ll > pll;
using namespace std;
const int N = 200'010;
vector<int> A[N];
vector<int> cs[N], vs[N]; int cnt = 0;
bool vis[N];
vector<int> st, vec;
int h[N];
int p[N];
ll stree[N];
tuple<int,int,int> dfs(int v)
{
vis[v] = 1;
int sum = 1;
int tsum = 1;
int mn = h[v];
for(int u : A[v])
{
if(vis[u]) mn = min(mn, h[u]);
else {
auto [x, y, z] = dfs((h[u] = h[v]+1, p[u]=v, u));
tsum += x;
if(z >= h[v]) {
vs[cnt].push_back(v);
cs[v].push_back(cnt);
while(y--)
{
int w = st.back(); st.pop_back();
cs[w].push_back(cnt);
vs[cnt].push_back(w);
}
++cnt;
} else {
mn = min(z, mn);
sum += y;
}
}
}
stree[v] = tsum;
st.push_back(v);
vec.push_back(v);
return {tsum, sum, mn};
}
ll cc[N]={};
ll solve(int v)
{
p[v] = -1;
vec.clear();
int l = cnt;
ll n = (dfs(v), vec.size());
int r = cnt;
Loop(c,l,r)
{
ll fsum = 0;
for(int v : vs[c])
{
ll sum = 1;
for(int u : A[v])
if(p[u] == v && cs[u].back() != c)
sum += stree[u];
if(c != cs[v].back())
sum += n - stree[v];
fsum += sum*(sum-1);
}
cc[c] = fsum;
}
ll ans = 0;
for(int v : vec)
{
ans += (n-1)*(n-2);
ll fsum = 0;
for(int c : cs[v])
{
ll sum = 1;
for(int u : A[v])
if(p[u] == v && cs[u].back() != c)
sum += stree[u];
if(c != cs[v].back())
sum += n - stree[v];
fsum += cc[c] - sum*(sum-1);
}
ans -= fsum;
}
return ans;
}
int n, m;
int main()
{
FAST;
cin >> n >> m;
Loop(i,0,m)
{
int v, u;
cin >> v >> u;
--v; --u;
A[v].push_back(u);
A[u].push_back(v);
}
ll ans = 0;
Loop(i,0,n) if(!vis[i]) ans += solve(i);
/*Loop(i,0,cnt)
{
for(int v : vs[i])
cout << v << ' ';
cout << '\n';
}*/
cout << ans << '\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... |