Submission #163370

#TimeUsernameProblemLanguageResultExecution timeMemory
163370MinnakhmetovPolitical Development (BOI17_politicaldevelopment)C++14
100 / 100
351 ms215268 KiB
#include <bits/stdc++.h>
    
#define ll long long
#define all(aaa) aaa.begin(), aaa.end()
 
using namespace std;

const int N = 5e4 + 5, K = 10;
vector<int> g[N], cand[N], anime[N];
int deg[N], dp[N][1 << K], sz[1 << K];
bool used[N], killed[N], on[N];

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);

    int n, k;
    cin >> n >> k;

    for (int i = 0; i < n; i++) {
    	cin >> deg[i];
    	for (int j = 0; j < deg[i]; j++) {
    		int x;
    		cin >> x;
    		g[i].push_back(x);
    	}
    }

    queue<int> q;

    for (int i = 0; i < n; i++) {
    	if (deg[i] < k) {
    		used[i] = 1;
    		q.push(i);
    	}
    }

    while (!q.empty()) {
    	int node = q.front();
    	q.pop();

    	killed[node] = 1;

    	for (int to : g[node]) {
    		if (!used[to]) {
    			deg[to]--;
    			if (deg[to] < k) {
    				used[to] = 1;
    				q.push(to);
    			}
    		}
    	}

    	for (int to : g[node]) {
    		if (!killed[to]) {
    			anime[to].push_back(node);
    			cand[node].push_back(to);
    		}
    	}

    	sort(all(cand[node]));

    	// cout << node << " : ";
    	// for (int x : cand[node])
    	// 	cout << x << " ";
    	// cout << "\n";
    }

    for (int i = 0; i < n; i++) {
    	for (int to : g[i]) {
    		on[to] = 1;
    	}
    	on[i] = 1;

    	for (int to : anime[i]) {
    		int m = 0, x;

    		for (int j = 0; j < cand[to].size(); j++) {
    			if (on[cand[to][j]]) {
    				m |= 1 << j;
    			}
    			if (cand[to][j] == i)
    				x = j;
    		}

    		// cout << (1 << x) << " " << m << "\n";

    		dp[to][1 << x] = m;
    	}

    	for (int to : g[i]) {
    		on[to] = 0;
    	}
    	on[i] = 0;
    }

    for (int i = 0; i < (1 << K); i++)
    	sz[i] = __builtin_popcount(i);

    int ans = 1;

    for (int i = 0; i < n; i++) {
    	int len = cand[i].size();

    	dp[i][0] = (1 << len) - 1;

    	for (int j = 1; j < (1 << len); j++) {
    		dp[i][j] = (dp[i][j & -j] & dp[i][j ^ (j & -j)]);


    		if (j == dp[i][j])
    			ans = max(ans, sz[j] + 1);
    	}
    }

    cout << ans;

    return 0;
} 

Compilation message (stderr)

politicaldevelopment.cpp: In function 'int main()':
politicaldevelopment.cpp:78:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for (int j = 0; j < cand[to].size(); j++) {
                       ~~^~~~~~~~~~~~~~~~~
politicaldevelopment.cpp:88:16: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
       dp[to][1 << x] = m;
              ~~^~~~
#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...