Submission #1306214

#TimeUsernameProblemLanguageResultExecution timeMemory
1306214tntPolitical Development (BOI17_politicaldevelopment)C++20
16 / 100
42 ms82648 KiB
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3")

#define pb push_back                    
#define ll long long
#define f first
#define s second
#define sz(v) int(v.size())
#define all(v) v.begin(),v.end()

int mod =  1e9 + 7;
const int N = 5000;
const ll inf = 2e18;
vector <int> g[N];
int mtr[N][N];
bool ch(int u, int v) {
    auto it = lower_bound(all(g[u]),v);
    if(it != g[u].end() && *it == v) return 1;
    else return 0;
}
int ans = 1,n,k;
void func(int idx, vector<int>& c, vector<int>& cur) {
    ans = max(ans, sz(cur) + 1);
    if(ans >= k) return;
    for(int i = idx; i < sz(c); i++){
        if (sz(cur) + 1 + (sz(c) - i) <= ans) return;
        int v = c[i];
        bool f = 1;
        for(auto to : cur){
            if(!ch(v, to)){
                f = 0;
                break;
            }
        }
        if(f == 1){
            cur.pb(v);
            func(i + 1, c, cur);
            cur.pop_back();
            if(ans >= k) return;
        }
    }
}
void solve(){
    cin >> n >> k;
    int mx = 0;
    for(int i = 0; i < n; i++){
        int d;
        cin >> d;
        for(int j = 0; j < d; j++){
            int x;
            cin >> x;
            if(n <= 5000) mtr[i][x] = 1;
            g[i].pb(x);
        }
        mx = max(mx,d);
        sort(all(g[i]));
    }
    if(mx <= 10){
        for(int i = 0; i < n; i++){
            if (ans >= k) break;
            vector<int> c;
            for(auto to : g[i]){
                if(to > i){
                    c.pb(to);
                }
            }
            if(sz(c) + 1 > ans){
                vector<int> cur;
                func(0, c, cur);
            }
        }
        cout << min(ans,k) << '\n';
    }
    else{
        ans = 1;
        if(k >= 2){
            for(int i = 0; i < n; i++){
                for(int j = i + 1; j < n; j++){
                    if(mtr[i][j] == 1 && mtr[j][i] == 1){
                        ans = 2;
                        break;
                    }
                }
            }
        }
        if(k <= 2){
            cout << ans;
            return;
        }
        for(int i = 0; i < n; i++){
            bool f = 0;
            for(auto to : g[i]){
                if(mtr[to][i] != 1) continue;
                for(auto to1 : g[to]){
                    if(to1 == i) continue;
                    if(mtr[i][to1] == 1 && mtr[to1][i] == 1 && mtr[to1][to] == 1){
                        f = 1;
                        break;
                    }
                }
                if(f == 1) break;
            }
            if(f == 1){
                cout << 3;
                return;
            }
        }
        cout << ans;
    }
}

signed main(){
    //freopen("time.in", "r", stdin);
    //freopen("time.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t1 = 1;
    while(t1--){
    	solve(); 
    }
}  
#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...