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