Submission #719378

#TimeUsernameProblemLanguageResultExecution timeMemory
719378n0sk1llPolitical Development (BOI17_politicaldevelopment)C++14
100 / 100
404 ms28500 KiB
#include <bits/stdc++.h> #define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cerr.tie(0) #define mp make_pair #define xx first #define yy second #define pb push_back #define pf push_front #define popb pop_back #define popf pop_front #define all(x) x.begin(),x.end() #define ff(i,a,b) for (int i = a; i < b; i++) #define fff(i,a,b) for (int i = a; i <= b; i++) #define bff(i,a,b) for (int i = b-1; i >= a; i--) #define bfff(i,a,b) for (int i = b; i >= a; i--) using namespace std; long double typedef ld; unsigned int typedef ui; long long int typedef li; pair<int,int> typedef pii; pair<li,li> typedef pli; pair<ld,ld> typedef pld; vector<vector<int>> typedef graph; unsigned long long int typedef ull; //const int mod = 998244353; const int mod = 1000000007; //Note to self: Check for overflow struct find_clique { int g[102]; //graph by bitmask int dp1[3500]; //first half int pc[3500]; //precalced int dp2[3500]; //second half void clear(int n) { ff(i,0,n) g[i]=0; ff(i,0,(1<<n)) dp1[i]=0; ff(i,0,(1<<n)) dp2[i]=0; } void add(int u, int v) { g[u]|=(1<<v); g[v]|=(1<<u); } /*int calc(int n) { int fh=n/2,sh=(n+1)/2,fb=(1<<fh)-1,sb=(1<<sh)-1; ff(i,0,(1<<sh)) pc[i]=__builtin_popcount(i); ff(mask,1,(1<<fh)) ff(j,0,fh) if (mask&(1<<j)) { dp1[mask]=max(dp1[mask],dp1[mask&g[j]]+1); } ff(mask,1,(1<<sh)) ff(j,0,sh) if (mask&(1<<j)) { dp2[mask]=max(dp2[mask],dp2[mask&(g[j]>>fh)]+1); } int ans=0; ff(mask,0,(1<<sh)) if (dp2[mask]==pc[mask]) { int span=0; ff(j,0,sh) if (mask&(1<<j)) span|=(g[j]&fb); ans=max(ans,pc[mask]+dp1[span]); } return ans; }*/ int calc(int n) { int ans=0; ff(mask,0,(1<<n)) { bool dobar=true; ff(j,0,n) if (mask&(1<<j)) if (((g[j]|(1<<j))&mask)!=mask) dobar=false; if (dobar) ans=max(ans,__builtin_popcount(mask)); } return ans; } } ok; set<pii> pq; set<int> idemo[100005]; int main() { FAST; int n,k; cin>>n>>k; ff(i,0,n) { int d; cin>>d; while (d--) { int x; cin>>x; idemo[i].insert(x); } } ff(i,0,n) pq.insert({(int)idemo[i].size(),i}); int ans=1; while (!pq.empty()) { int p=pq.begin()->yy; vector<int> cvors; cvors.pb(p); for (auto it : idemo[p]) cvors.pb(it); /*cout<<"consider: "; for (auto it : cvors) cout<<it<<" "; cout<<endl;*/ ok.clear((int)cvors.size()); ff(i,0,(int)cvors.size()) ff(j,i+1,(int)cvors.size()) if (idemo[cvors[i]].count(cvors[j])) ok.add(i,j); ans=max(ans,ok.calc((int)cvors.size())); for (auto it : idemo[p]) pq.erase({(int)idemo[it].size(),it}),idemo[it].erase(p),pq.insert({(int)idemo[it].size(),it}); pq.erase({(int)idemo[p].size(),p}); } cout<<ans<<"\n"; } //Note to self: Check for overflow /* 5 3 2 1 2 3 0 2 3 3 0 1 4 2 1 4 2 2 3 */
#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...