# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
659415 | activedeltorre | 철인 이종 경기 (APIO18_duathlon) | C++14 | 141 ms | 31824 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long sef[100005];
long long sz[100005];
long long fre[100005];
long long lvl[100005];
long long best[100005];
long long parent[100005];
vector<pair<long long,long long> >adj[100005];
vector<long long>adi[100005];
long long find (long long u)
{
if(sef[u]==u)
{
return u;
}
return sef[u]=find(sef[u]);
}
long long merge (long long a,long long b)
{
a=find(a);
b=find(b);
if(a!=b)
{
if(sz[a]<sz[b])
{
swap(a,b);
}
sef[b]=a;
sz[a]=sz[a]+sz[b];
sz[b]=0;
return 1;
}
return 0;
}
struct str
{
long long a,b,poz,folos=0;
};
str edges[200005];
void dfs(long long curr,long long par)
{
parent[curr]=par;
lvl[curr]=lvl[par]+1;
fre[curr]=1;
best[curr]=lvl[curr];
long long i,k;
for(i=0;i<adj[curr].size();i++)
{
k=adj[curr][i].first;
if(fre[k]==0)
{
edges[adj[curr][i].second].folos=1;
dfs(k,curr);
}
else if(k!=par)
{
best[curr]=min(best[curr],lvl[k]);
}
}
}
bool cmp(long long a,long long b)
{
return lvl[a]>lvl[b];
}
long long v[100005];
long long suma=0;
long long subtree[100005];
long long n;
void dfs2(long long curr,long long parent)
{
long long i,k,rest;
for(i=0;i<adi[curr].size();i++)
{
k=adi[curr][i];
if(k!=parent)
{
dfs2(k,curr);
subtree[curr]=subtree[curr]+subtree[k]+sz[k];
}
}
// for(i=0;i<special)
rest=n-subtree[curr]-sz[curr];
suma=suma+sz[curr]*(sz[curr]-1)*(sz[curr]-2);
suma=suma+sz[curr]*(sz[curr]-1)*(rest)*2;
suma=suma+sz[curr]*(sz[curr]-1)*(subtree[curr])*2;
suma=suma+sz[curr]*(subtree[curr])*(rest)*2;
}
int main()
{
long long i,j,k,l,a,b,m;
cin>>n>>m;
for(i=1;i<=n;i++)
{
sef[i]=i;
sz[i]=1;
}
for(i=1;i<=m;i++)
{
cin>>edges[i].a>>edges[i].b;
edges[i].poz=i;
edges[i].folos=0;
adj[edges[i].a].push_back({edges[i].b,i});
adj[edges[i].b].push_back({edges[i].a,i});
}
dfs(1,0);
for(i=1;i<=n;i++)
{
v[i]=i;
}
sort(v+1,v+n+1,cmp);
for(i=1;i<n;i++)
{
if(best[v[i]]<=lvl[v[i]]-1)
{
merge(v[i],parent[v[i]]);
}
}
for(i=1;i<n;i++)
{
a=find(v[i]);
b=find(parent[v[i]]);
if(a!=b)
{
adi[a].push_back(b);
adi[b].push_back(a);
}
}
dfs2(find(1),0);
cout<<suma;
return 0;
}
컴파일 시 표준 에러 (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... |