Submission #567350

#TimeUsernameProblemLanguageResultExecution timeMemory
567350SavicSPolitical Development (BOI17_politicaldevelopment)C++17
100 / 100
1521 ms37120 KiB
#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <bits/stdc++.h> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ldb; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef pair<ldb,ldb> pdd; #define ff(i,a,b) for(int i = a; i <= b; i++) #define fb(i,b,a) for(int i = b; i >= a; i--) #define trav(a,x) for (auto& a : x) #define sz(a) (int)(a).size() #define fi first #define se second #define pb push_back #define lb lower_bound #define ub upper_bound #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; // os.order_of_key(k) the number of elements in the os less than k // *os.find_by_order(k) print the k-th smallest number in os(0-based) const int mod = 1000000007; const int inf = 1e9 + 5; const int mxN = 50005; int n, K; vector<int> g[mxN]; int deg[mxN]; bool los[mxN]; int dp[(1 << 11)]; int msk[(1 << 11)]; int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> K; map<pii,bool> ima; ff(i,1,n){ int len; cin >> len; ff(j,1,len){ int X; cin >> X; X++; g[i].pb(X); deg[i] += 1; ima[{i, X}] = ima[{X, i}] = 1; } } set<pii> s; ff(i,1,n)s.insert({deg[i], i}); int rez = 0; while(sz(s)){ pii X = *s.begin(); s.erase(X); deg[X.se] = 0; vector<int> vec; vec.pb(X.se); for(auto c : g[X.se]){ if(deg[c] > 0){ vec.pb(c); } } int L = sz(vec); // assert(L <= 10); ff(i,0,L - 1){ msk[(1 << i)] = (1 << i); ff(j,0,L - 1){ if(ima.count({vec[i], vec[j]}) == 1){ msk[(1 << i)] |= (1 << j); } } } dp[0] = (1 << L) - 1; ff(mask,1,(1 << L) - 1){ int j = mask & (-mask); dp[mask] = dp[mask ^ j] & msk[j]; } ff(mask,1,(1 << L) - 1){ if((dp[mask] & mask) == mask){ rez = max(rez, __builtin_popcount(mask)); } } ff(i,1,L - 1){ int A = vec[i]; s.erase({deg[A], A}); deg[A] -= 1; if(deg[A] > 0)s.insert({deg[A], A}); } } cout << rez << '\n'; return 0; } /* 5 3 2 1 2 3 0 2 3 3 0 1 4 2 1 4 2 2 3 // probati bojenje sahovski */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...