답안 #94906

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
94906 2019-01-24T20:00:44 Z WLZ Conspiracy (POI11_kon) C++17
40 / 100
3000 ms 103032 KB
#include <bits/stdc++.h>
using namespace std;
 
int n;
vector< vector<short> > g, tg;
vector< bitset<5001> > mat;
vector<int> was, topoSort, scc;
int cur = 1;
vector<int> as;
vector<int> st; 

void reverse_graph() {
  for (int u = 1; u < 2 * n + 1; u ++) {
    for (auto& v: g[u]) {
      tg[v].push_back(u);
    }
    vector<short>().swap(g[u]);
  }
}

void add_edge(int u, int v) {
  g[u].push_back(v);
}
 
void dfs1(int u) {
  was[u] = 1;
  for (auto& v : g[u]) {
    if (!was[v]) {
      dfs1(v);
    }
  }
  topoSort.push_back(u);
}
 
void dfs2(int u) {
  scc[u] = cur;
  was[u] = 1;
  for (auto& v : tg[u]) {
    if (!was[v]) {
      dfs2(v);
    }
  }
}
 
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  mat.assign(n + 1, bitset<5001>());
  g.resize(2 * n + 1);
  tg.resize(2 * n + 1);
  for (int i = 1; i <= n; i++) {
    int k;
    cin >> k;
    while (k--) {
      int a;
      cin >> a;
      mat[a][i] = mat[i][a] = 1;
    }
  }
  for (int i = 1; i <= n - 1; i++) {
    for (int j = i + 1; j <= n; j++) {
      if (mat[i][j]) {
        add_edge(i, j + n);
        add_edge(j, i + n);
      } else {
        add_edge(i + n, j);
        add_edge(j + n, i);
      }
    }
  }
  was.assign(2 * n + 1, 0);
  for (int i = 1; i <= 2 * n; i++) {
    if (!was[i]) {
      dfs1(i);
    }
  }
  reverse(topoSort.begin(), topoSort.end());
  reverse_graph();
  scc.assign(2 * n + 1, -1);
  was.assign(2 * n + 1, 0);
  for (auto& u : topoSort) {
    if (!was[u]) {
      dfs2(u);
      cur++;
    }
  }
  as.resize(n + 1);
  for (int i = 1; i <= n; i++) {
    if (scc[i] == scc[i + n]) {
      cout << 0 << '\n';
      return 0;
    }
    as[i] = scc[i] > scc[i + n];
  }
  int ans = 1;
  int sup = 0, con = 0;
  for (int i = 1; i <= n; i++) {
    sup += 1 - as[i];
    con += as[i];
  }
  if ((sup == 0) || (con == 0)) {
    ans = 0;
  } 
  for (int i = 1; i <= n; i++) {
    if (as[i]) {
      int pos = 1;
      if (con == 1) {
        pos = 0;
      } else {
        for (int j = 1; j <= n; j++) {
          if (!as[j] && !mat[i][j]) {
            pos = 0;
            break;
          }
        }
      }
      ans += pos;
    } else {
      int pos = 1;
      if (sup == 1) {
        pos = 0;
      } else {
        for (int j = 1; j <= n; j++) {
          if (as[j] && mat[i][j]) {
            pos = 0;
            break;
          }
        }
      }
      ans += pos;
    }
  }
  st.resize(n + 1);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((as[i] && !as[j] && !mat[i][j]) || (!as[i] && as[j] && mat[i][j])) {
        if (st[i] > 0) {
          st[i] = -1;
          break;
        } else {
          st[i] = j;
        }
      } 
    }
  }
  for (int i = 1; i <= n - 1; i++) {
    if (st[i] > 0) {
      int j = st[i]; 
      if ((j > i) && (as[i] != as[j])) {
        if ((st[j] == 0) || (st[j] = i)) {
          ans++;
        }
      }
    } else if (st[i] == 0) {
      for (int j = i + 1; j <= n; j++) {
        if (as[i] != as[j]) {
          if (st[j] == 0 || st[j] == i) {
            ans++;
          }
        }
      }
    }
  }
  cout << ans << '\n';
  return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 504 KB Output is correct
2 Correct 4 ms 632 KB Output is correct
3 Correct 3 ms 508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 632 KB Output is correct
2 Correct 5 ms 760 KB Output is correct
3 Correct 4 ms 632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 8568 KB Output is correct
2 Incorrect 111 ms 9676 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 10264 KB Output is correct
2 Incorrect 174 ms 13688 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 299 ms 26548 KB Output is correct
2 Incorrect 422 ms 29356 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 807 ms 54944 KB Output is correct
2 Incorrect 1068 ms 57720 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2102 ms 94968 KB Output is correct
2 Correct 1764 ms 97000 KB Output is correct
3 Correct 2940 ms 94712 KB Output is correct
4 Execution timed out 3056 ms 103032 KB Time limit exceeded
5 Halted 0 ms 0 KB -