Submission #103233

#TimeUsernameProblemLanguageResultExecution timeMemory
103233E869120Duathlon (APIO18_duathlon)C++14
24 / 100
138 ms13688 KiB
#include <iostream> #include <vector> using namespace std; #pragma warning (disable: 4996) long long N, M, A[200009], B[200009], col[100009], col2[100009], cnt1, cnt2, cnts, cntv; vector<int>X[100009], Y[100009]; 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]); } } 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; } 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]); } if (N <= 50 && M <= 100) { cout << solve_subtask2() << endl; } else { cout << solve_subtask3() << endl; } return 0; }

Compilation message (stderr)

count_triplets.cpp:4:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable: 4996)
 
count_triplets.cpp: In function 'void dfs(int)':
count_triplets.cpp:13:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < X[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs2(int)':
count_triplets.cpp:21:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < Y[pos].size(); i++) {
                  ~~^~~~~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:94:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld", &N, &M);
  ~~~~~^~~~~~~~~~~~~~~~~~~~
count_triplets.cpp:96:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld", &A[i], &B[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...