# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
103234 | E869120 | 철인 이종 경기 (APIO18_duathlon) | C++14 | 158 ms | 13760 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#pragma warning (disable: 4996)
long long N, M, A[200009], B[200009], col[100009], col2[100009], dp[100009], cnt1, cnt2, cnts, cntv;
vector<int>X[100009], Y[100009], V;
vector<int>G[59][59];
void dfs(int pos) {
if (col[pos] >= 1) return;
col[pos] = cnts; cnt1 += 1; cnt2 += X[pos].size();
for (int i = 0; i < X[pos].size(); i++) {
dfs(X[pos][i]);
}
}
void dfs2(int pos) {
if (col2[pos] >= 1) return;
col2[pos] = cntv;
for (int i = 0; i < Y[pos].size(); i++) {
dfs2(Y[pos][i]);
}
}
void dfs3(int pos) {
dp[pos] = 1; V.push_back(pos);
for (int i = 0; i < X[pos].size(); i++) {
if (dp[X[pos][i]] >= 1) continue;
dfs3(X[pos][i]);
dp[pos] += dp[X[pos][i]];
}
}
long long solve_subtask2() {
for (int i = 1; i <= N; i++) {
if (col[i] >= 1) continue;
cnts++; dfs(i);
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) Y[j].clear();
for (int j = 1; j <= M; j++) {
if (A[j] == i || B[j] == i) continue;
Y[A[j]].push_back(B[j]);
Y[B[j]].push_back(A[j]);
}
cntv = 0;
for (int j = 1; j <= N; j++) col2[j] = 0;
for (int j = 1; j <= N; j++) {
if (col2[j] >= 1) continue;
cntv++; dfs2(j);
}
for (int j = 1; j <= N; j++) {
for (int k = 1; k <= N; k++) {
if (col[j] != col[k]) continue;
if (col2[j] != col2[k]) G[j][k].push_back(i);
}
}
}
int cnt = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
for (int k = 1; k <= N; k++) {
if (i == j || i == k || j == k || col[i] != col[j] || col[j] != col[k]) continue;
int d[55]; for (int l = 0; l < 55; l++) d[l] = 0;
for (int l : G[i][j]) d[l]++;
for (int l : G[j][k]) d[l]++;
bool flag = false;
for (int l = 0; l < 55; l++) {
if (d[l] >= 2 && l != j) flag = true;
}
if (flag == false) {
cnt++;
}
}
}
}
return 1LL * cnt;
}
long long solve_subtask3() {
long long ans = 0; cnts = 1;
for (int i = 1; i <= N; i++) {
if (col[i] >= 1) continue;
cnt1 = 0; cnt2 = 0;
dfs(i); cnt2 /= 2;
if (cnt1 == cnt2) ans += 1LL * cnt1 * (cnt1 - 1) * (cnt1 - 2);
else ans += 1LL * cnt1 * (cnt1 - 1) * (cnt1 - 2) / 3LL;
}
return ans;
}
long long solve_subtask5() {
long long ans = 0;
for (int i = 1; i <= N; i++) {
if (dp[i] >= 1) continue;
V.clear();
dfs3(i);
long long size_ = V.size();
ans += size_ * (size_ - 1) * (size_ - 2);
for (int pos : V) {
long long rem = size_ - 1;
for (int j = 0; j < X[pos].size(); j++) {
if (dp[X[pos][j]] > dp[pos]) continue;
ans -= dp[X[pos][j]] * (dp[X[pos][j]] - 1);
rem -= dp[X[pos][j]];
}
ans -= rem * (rem - 1);
}
}
return ans;
}
int main() {
scanf("%lld%lld", &N, &M);
for (int i = 1; i <= M; i++) {
scanf("%lld%lld", &A[i], &B[i]);
X[A[i]].push_back(B[i]);
X[B[i]].push_back(A[i]);
}
int max_degree = 0;
for (int i = 1; i <= N; i++) max_degree = max(max_degree, (int)X[i].size());
if (N <= 50 && M <= 100) {
cout << solve_subtask2() << endl;
}
else if (max_degree <= 2) {
cout << solve_subtask3() << endl;
}
else {
cout << solve_subtask5() << endl;
}
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... |