#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 << ' '; } } |
English