# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
51067 | yp155136 | 철인 이종 경기 (APIO18_duathlon) | C++14 | 352 ms | 72300 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 400006;
int e[N];
vector<int> G[N];
int dfn_clock[N];
int stamp=0;
bool vis[N];
int low[N];
stack<int> sta;
vector<int> bcc[N];
vector<int> vv[N];
int bcc_no = 0;
void dfs(int now,int par)
{
//cout << "now = " << now << " , par = " << par <<endl;
dfn_clock[now] = low[now] = (++stamp);
vis[now] = true;
for (int i:G[now])
{
int to = (e[i]^now);
if (to == par) continue;
if (!vis[to])
{
sta.push(i);
dfs(to,now);
low[now] = min(low[now],low[to]);
if (low[to] >= dfn_clock[now])
{
bcc_no++;
int p;
do {
p = sta.top();
bcc[bcc_no].push_back(p);
sta.pop();
} while (p != i);
}
}
else if (dfn_clock[to] < dfn_clock[now])
{
sta.push(i);
low[now] = min(low[now],dfn_clock[to]);
}
}
}
typedef long long LL;
LL ans=0;
int cnt[N];
int in_bcc[N];
int type[N];
int sz[N];
int n,m;
int vis2[N];
int vis_id = 880301;
int xx[N],yy[N];
vector<int> G2[N];
int subtree_sz[N];
void dfs2(int now,int par)
{
subtree_sz[now] = sz[now];
for (int i:G2[now])
{
if(i != par)
{
dfs2(i,now);
subtree_sz[now] += subtree_sz[i];
}
}
}
void dfs3(int now,int par)
{
if (type[now] == 2)
{
//cout << "now = " << now << endl;
//cut vertex
for (int i:G2[now])
{
ans += (sz[i]*1LL*(sz[i]-1));
//cout << "ans = " << ans << endl;
}
//two different
vector<int> szz;
for (int i:G2[now])
{
if (subtree_sz[i] >= subtree_sz[now])
{
szz.push_back(n - subtree_sz[now]);
}
else
{
szz.push_back(subtree_sz[i]);
}
}
LL tot=0,tot2=0;
for (int i:szz)
{
tot += i;
tot2 += i*1LL*i;
}
ans += (tot*tot-tot2);
//cout << "ans = " << ans << endl;
}
else if (type[now] == 1)
{
;
}
for (int i:G2[now])
{
if (i != par)
{
dfs3(i,now);
}
}
}
int main ()
{
scanf("%d %d",&n,&m);
for (int i=1;i<=m;++i)
{
int x,y;
scanf("%d %d",&x,&y);
e[i] = (x^y);
G[x].push_back(i);
G[y].push_back(i);
xx[i] = x;
yy[i] = y;
}
dfs(1,1);
/*for (int i=1;bcc_no>=i;i++)
{
cout << "i = " << i << " : ";
for (int j:bcc[i]) cout << j << ' ';
cout << endl;
}*/
for (int i=1;i<=bcc_no;++i)
{
++vis_id;
vector<int> v;
for (int j:bcc[i])
{
if (vis2[ xx[j] ] != vis_id)
{
v.push_back(xx[j]);
vis2[ xx[j] ] = vis_id;
}
if (vis2[ yy[j] ] != vis_id)
{
v.push_back(yy[j]);
vis2[ yy[j] ] = vis_id;
}
}
for (int j:v)
{
cnt[j]++;
}
vv[i] = v;
}
int vid = n;
for (int i=1;i<=bcc_no;++i)
{
++vid;
type[vid] = 1;
for (int j:vv[i])
{
if (cnt[j] == 1)
{
sz[vid]++;
}
else
{
G2[vid].push_back(j);
G2[j].push_back(vid);
type[j] = 2;
sz[j] = 1;
}
}
}
dfs2(vid,vid);
dfs3(vid,vid);
printf("%lld\n",ans);
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |