#include <bits/stdc++.h> #define BTS 1000 using namespace std; vector<int> sc[200005], cgt[200005]; int sm[200005]; int odw[200005], sow = 1, cm, stw; bool ibc[200005]; bitset<BTS> km[BTS + 10]; bool dfs(int w, int s = 0) { if (odw[w] == sow) return 0; ibc[w] = 1; odw[w] = sow; bool p = 1, aaa = 0; for (auto i : sc[w]) { if (i == w || i > cm || ibc[i]) { km[w].set(); km[w].flip(); if (ibc[i]) { km[w][i] = 1; odw[w] = 0; aaa = 1; } break; } // if (stw == 11 && cm == 20) // cout << "W " << w << ' ' << i << '\n'; bool z = dfs(i); if (z) { odw[w] = 0; aaa = 1; } km[w] &= km[i]; if (p) { km[w] = km[i]; p = 0; } } // if (stw == 11 && cm == 20) // { // cout << sow << ' ' << w << ' ' << stw << ' '; // // if (sow == 209) // for (int i = 1; i <= cm; i++) // cout << km[w][i]; // // if (sow == 209) // cout << '\n'; // } km[w][w] = 1; ibc[w] = 0; return aaa; } int main() { ios_base::sync_with_stdio(0); int n; cin >> n; for (int i = 1; i <= n; i++) { int q; cin >> q; while (q--) { int a; cin >> a; // if (a < i) sc[i].push_back(a); // if (a > i) // cout << i << ' ' << a << '\n'; // cgt[a].push_back(i); } sort(sc[i].begin(), sc[i].end()); } bitset<BTS> odw[n + 2]; long long sp = 0; for (int i = 1; i <= n; i++) { sp = 0; cm = i; sow++; for (int j = 1; j <= i; j++) { // cout<<i<<' '<<j<<endl; stw = j; dfs(j, 1); sp += km[j].count() - km[j][j]; // cout << km[j].count() - km[j][j] << ' '; // cout << km[j].count() << ' ' << km[j][j] << '\n'; } cout << sp << ' '; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <bits/stdc++.h> #define BTS 1000 using namespace std; vector<int> sc[200005], cgt[200005]; int sm[200005]; int odw[200005], sow = 1, cm, stw; bool ibc[200005]; bitset<BTS> km[BTS + 10]; bool dfs(int w, int s = 0) { if (odw[w] == sow) return 0; ibc[w] = 1; odw[w] = sow; bool p = 1, aaa = 0; for (auto i : sc[w]) { if (i == w || i > cm || ibc[i]) { km[w].set(); km[w].flip(); if (ibc[i]) { km[w][i] = 1; odw[w] = 0; aaa = 1; } break; } // if (stw == 11 && cm == 20) // cout << "W " << w << ' ' << i << '\n'; bool z = dfs(i); if (z) { odw[w] = 0; aaa = 1; } km[w] &= km[i]; if (p) { km[w] = km[i]; p = 0; } } // if (stw == 11 && cm == 20) // { // cout << sow << ' ' << w << ' ' << stw << ' '; // // if (sow == 209) // for (int i = 1; i <= cm; i++) // cout << km[w][i]; // // if (sow == 209) // cout << '\n'; // } km[w][w] = 1; ibc[w] = 0; return aaa; } int main() { ios_base::sync_with_stdio(0); int n; cin >> n; for (int i = 1; i <= n; i++) { int q; cin >> q; while (q--) { int a; cin >> a; // if (a < i) sc[i].push_back(a); // if (a > i) // cout << i << ' ' << a << '\n'; // cgt[a].push_back(i); } sort(sc[i].begin(), sc[i].end()); } bitset<BTS> odw[n + 2]; long long sp = 0; for (int i = 1; i <= n; i++) { sp = 0; cm = i; sow++; for (int j = 1; j <= i; j++) { // cout<<i<<' '<<j<<endl; stw = j; dfs(j, 1); sp += km[j].count() - km[j][j]; // cout << km[j].count() - km[j][j] << ' '; // cout << km[j].count() << ' ' << km[j][j] << '\n'; } cout << sp << ' '; } } |