#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define losuj(a, b) uniform_int_distribution<long long>(a, b)(rng)
#define sz(s) (int)s.size()
#define all(s) s.begin(), s.end()
#define f first
#define s second
#define pb push_back
#define ii pair<int, int>
#define vi vector<int>
#define vii vector<ii>
#define vvi vector<vi>
#define vvii vector<vii>
#define ll long long
const int N = 2e5 + 5;
vvi G(N), rev(N);
int n;
vector<ll> ans(N);
vi wagi(N);
vi zmiany_score(N);
vi stopnie(N);
void solve(){
cin >> n;
for(int i = 1; i <= n; i++){
int ile;
cin >> ile;
for(int j = 0; j < ile; j++){
int temp;
cin >> temp;
G[i].pb(temp);
rev[temp].pb(i);
}
sort(all(G[i]));
G[i].resize(unique(all(G[i])) - G[i].begin());
}
for(int i = 1; i <= n; i++){
sort(all(rev[i]));
rev[i].resize(unique(all(rev[i])) - rev[i].begin());
}
for(int i = 1; i <= n; i++){
// cout << "ROBIE SOBIE OD TYŁU DLA " << i << endl;
// które i od kiedy muszą przeze mnie przechodzić?
for(int j = 1; j <= n; j++){
wagi[j] = j;
stopnie[j] = sz(G[j]);
}
stopnie[i] = -1;
stack<int> stos;
stos.push(i);
// bool debug = (i == 5);
while(sz(stos)){
int akt = stos.top();
stos.pop();
// cout << akt << ' ' << wagi[akt] << endl;
if(akt != i)
zmiany_score[wagi[akt]]++;
for(auto & u : rev[akt]){
wagi[u] = max(wagi[u], wagi[akt]);
stopnie[u]--;
// if(debug)
// cout << "ZMNIEJSZAM STOPIEN " << u << " NA " << stopnie[u] << endl;
if(stopnie[u] == 0)
stos.push(u);
}
}
}
ll dod = 0;
for(int j = 1; j <= n; j++){
dod += zmiany_score[j];
ans[j] += dod;
}
for(int i = 1; i <= n; i++)
cout << ans[i] << ' ';
cout << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int tests = 1;
// cin >> tests;
for (int i = 0; i < tests; i++)
solve();
return 0;
}
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 102 103 104 105 106 107 | #pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define losuj(a, b) uniform_int_distribution<long long>(a, b)(rng) #define sz(s) (int)s.size() #define all(s) s.begin(), s.end() #define f first #define s second #define pb push_back #define ii pair<int, int> #define vi vector<int> #define vii vector<ii> #define vvi vector<vi> #define vvii vector<vii> #define ll long long const int N = 2e5 + 5; vvi G(N), rev(N); int n; vector<ll> ans(N); vi wagi(N); vi zmiany_score(N); vi stopnie(N); void solve(){ cin >> n; for(int i = 1; i <= n; i++){ int ile; cin >> ile; for(int j = 0; j < ile; j++){ int temp; cin >> temp; G[i].pb(temp); rev[temp].pb(i); } sort(all(G[i])); G[i].resize(unique(all(G[i])) - G[i].begin()); } for(int i = 1; i <= n; i++){ sort(all(rev[i])); rev[i].resize(unique(all(rev[i])) - rev[i].begin()); } for(int i = 1; i <= n; i++){ // cout << "ROBIE SOBIE OD TYŁU DLA " << i << endl; // które i od kiedy muszą przeze mnie przechodzić? for(int j = 1; j <= n; j++){ wagi[j] = j; stopnie[j] = sz(G[j]); } stopnie[i] = -1; stack<int> stos; stos.push(i); // bool debug = (i == 5); while(sz(stos)){ int akt = stos.top(); stos.pop(); // cout << akt << ' ' << wagi[akt] << endl; if(akt != i) zmiany_score[wagi[akt]]++; for(auto & u : rev[akt]){ wagi[u] = max(wagi[u], wagi[akt]); stopnie[u]--; // if(debug) // cout << "ZMNIEJSZAM STOPIEN " << u << " NA " << stopnie[u] << endl; if(stopnie[u] == 0) stos.push(u); } } } ll dod = 0; for(int j = 1; j <= n; j++){ dod += zmiany_score[j]; ans[j] += dod; } for(int i = 1; i <= n; i++) cout << ans[i] << ' '; cout << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); int tests = 1; // cin >> tests; for (int i = 0; i < tests; i++) solve(); return 0; } |
English