Submission #240155

#TimeUsernameProblemLanguageResultExecution timeMemory
240155IgorIPolitical Development (BOI17_politicaldevelopment)C++17
39 / 100
575 ms33528 KiB
const int LG = 21; const int N = 400030; const long long MOD = 998244353; const long long INF = 1e9; const long long INFLL = 1e18; #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<vector<int> > vvi; typedef vector<ll> vll; #define forn(i, n) for (int (i) = 0; (i) != (n); (i)++) #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define popcount(x) __builtin_popcount(x) #define popcountll(x) __builtin_popcountll(x) #define fi first #define se second #define re return #define pb push_back #define uniq(x) sort(all(x)); (x).resize(unique(all(x)) - (x).begin()) #ifdef LOCAL #define dbg(x) cerr << __LINE__ << " " << #x << " " << x << endl #define ln cerr << __LINE__ << endl #else #define dbg(x) void(0) #define ln void(0) #endif // LOCAL int cx[4] = {-1, 0, 1, 0}; int cy[4] = {0, -1, 0, 1}; string Yes[2] = {"No", "Yes"}; string YES[2] = {"NO", "YES"}; ll inq(ll x, ll y) { if (!y) re 1 % MOD; ll l = inq(x, y / 2); if (y % 2) re l * l % MOD * x % MOD; re l * l % MOD; } ll rev(ll x) { return inq(x, MOD - 2); } bool __precomputed_combinatorics = 0; vector<ll> __fact, __ufact, __rev; void __precompute_combinatorics() { __precomputed_combinatorics = 1; __fact.resize(N); __ufact.resize(N); __rev.resize(N); __rev[1] = 1; for (int i = 2; i < N; i++) __rev[i] = MOD - __rev[MOD % i] * (MOD / i) % MOD; __fact[0] = 1, __ufact[0] = 1; for (int i = 1; i < N; i++) __fact[i] = __fact[i - 1] * i % MOD, __ufact[i] = __ufact[i - 1] * __rev[i] % MOD; } ll fact(int x) { if (!__precomputed_combinatorics) __precompute_combinatorics(); return __fact[x]; } ll cnk(int n, int k) { if (k < 0 || k > n) return 0; if (!__precomputed_combinatorics) __precompute_combinatorics(); return __fact[n] * __ufact[n - k] % MOD * __ufact[k] % MOD; } int Root(int x, vector<int> &root) { if (x == root[x]) return x; return root[x] = Root(root[x], root); } void Merge(int v, int u, vector<int> &root, vector<int> &sz) { v = Root(v, root), u = Root(u, root); if (v == u) return; if (sz[v] < sz[u]) { sz[u] += sz[v]; root[v] = u; } else { sz[v] += sz[u]; root[u] = v; } } int ok(int x, int n) { return 0 <= x && x < n; } void bfs(int v, vi &dist, vector<vi> &graph) { fill(all(dist), -1); dist[v] = 0; vi q = {v}; for (int i = 0; i < q.size(); i++) { for (auto u : graph[q[i]]) { if (dist[u] == -1) { dist[u] = dist[q[i]] + 1; q.push_back(u); } } } } vector<int> z_func(string &s) { vector<int> z(s.size()); z[0] = s.size(); int L = 0, R = 0; for (int i = 1; i < s.size(); i++) { z[i] = max(0, min(z[i - L], R - i)); while (i + z[i] < s.size() && s[i + z[i]] == s[z[i]]) z[i]++; if (i + z[i] > R) { R = i + z[i]; L = i; } } return z; } vector<int> p_func(string &s) { vector<int> p(s.size()); for (int i = 1; i < s.size(); i++) { int j = p[i - 1]; while (j > 0 && s[i] != s[j]) j = p[j - 1]; if (s[i] == s[j]) j++; p[i] = j; } return p; } vector<int> d1_func(string &s) { vector<int> d1(s.size()); int L = 0, R = -1; for (int i = 0; i < s.size(); i++) { int k = 0; if (i <= R) k = min(R - i + 1, d1[R - i + L]); while (i + k < s.size() && i - k >= 0 && s[i - k] == s[i + k]) k++; d1[i] = k--; if (i + k > R) { L = i - k; R = i + k; } } return d1; } vector<int> d2_func(string &s) { vector<int> d2(s.size()); int L = 0, R = -1; for (int i = 1; i < s.size(); i++) { int k = 0; if (i <= R) k = min(R - i + 1, d2[R - i + L + 1]); while (i + k < s.size() && i - k - 1 >= 0 && s[i - k - 1] == s[i + k]) k++; d2[i] = k--; if (i + k > R) { L = i - k - 1; R = i + k; } } return d2; } ll log10(ll x) { if (x < 10) re 1; re 1 + log10(x / 10); } ll ds(ll x) { if (x < 10) return x; re x % 10 + ds(x / 10); } double sqr(double x) { return x * x; } bool in(int bit, int mask) { return (mask & (1 << bit)) > 0; } void Del(vector<int> &v, int pos) { swap(v[pos], v[v.size() - 1]); v.pop_back(); } long long g(vector<long long> &p, int pos) { if (ok(pos, p.size())) return p[pos]; if (pos < 0 || p.size() == 0) return 0; return p.back(); } int g(vector<int> &p, int pos) { if (ok(pos, p.size())) return p[pos]; if (pos < 0 || p.size() == 0) return 0; return p.back(); } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, k; cin >> n >> k; vector<vector<int> > graph(n); map<pii, int> mm; forn(i, n) { int s; cin >> s; forn(j, s) { int a; cin >> a; graph[i].push_back(a); mm[{i, a}] = 1; } } set<pair<int, int> > deg_act; vector<int> isact(n, 1); vector<int> deg(n, 1); for (int i = 0; i < n; i++) { deg_act.insert({graph[i].size(), i}); deg[i] = graph[i].size(); } int ans = 1; while (deg_act.size()) { vector<int> V; auto it = deg_act.begin(); while (V.size() < 2) { if (it == deg_act.end()) break; pii x = *it; if (x.first != (*deg_act.begin()).first) break; V.push_back(x.second); it++; } for (auto x : V) { vector<int> v; for (auto u : graph[x]) { if (isact[u]) v.push_back(u); } assert(v.size() <= k); forn(mask, (1 << v.size())) { if (popcount(mask) + 1 < ans) continue; int t = 1; for (int i = 0; t && i < v.size(); i++) for (int j = i + 1; t && j < v.size(); j++) if (in(i, mask) && in(j, mask)) { if (mm[{v[i], v[j]}] == 0) t = 0; break; } if (t) ans = max(ans, popcount(mask) + 1); } } for (auto x : V) { isact[x] = 0; deg_act.erase({deg[x], x}); for (auto u : graph[x]) { if (isact[u]) { deg_act.erase({deg[u], u}); deg[u]--; deg_act.insert({deg[u], u}); } } } } cout << ans; } /* Note: Check constants at the beginning of the code. N is set to 4e5 but be careful in problems with large constant factor. Setting N in every problem is more effective. Check corner cases. N = 1 No def int long long for now. Add something here. */

Compilation message (stderr)

politicaldevelopment.cpp: In function 'void bfs(int, vi&, std::vector<std::vector<int> >&)':
politicaldevelopment.cpp:115:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < q.size(); i++)
                     ~~^~~~~~~~~~
politicaldevelopment.cpp: In function 'std::vector<int> z_func(std::__cxx11::string&)':
politicaldevelopment.cpp:133:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < s.size(); i++)
                     ~~^~~~~~~~~~
politicaldevelopment.cpp:136:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i + z[i] < s.size() && s[i + z[i]] == s[z[i]]) z[i]++;
                ~~~~~~~~~^~~~~~~~~~
politicaldevelopment.cpp: In function 'std::vector<int> p_func(std::__cxx11::string&)':
politicaldevelopment.cpp:149:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < s.size(); i++)
                     ~~^~~~~~~~~~
politicaldevelopment.cpp: In function 'std::vector<int> d1_func(std::__cxx11::string&)':
politicaldevelopment.cpp:165:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < s.size(); i++)
                     ~~^~~~~~~~~~
politicaldevelopment.cpp:169:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i + k < s.size() && i - k >= 0 && s[i - k] == s[i + k])
                ~~~~~~^~~~~~~~~~
politicaldevelopment.cpp: In function 'std::vector<int> d2_func(std::__cxx11::string&)':
politicaldevelopment.cpp:185:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 1; i < s.size(); i++)
                     ~~^~~~~~~~~~
politicaldevelopment.cpp:189:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i + k < s.size() && i - k - 1 >= 0 && s[i - k - 1] == s[i + k])
                ~~~~~~^~~~~~~~~~
In file included from /usr/include/c++/7/cassert:44:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33,
                 from politicaldevelopment.cpp:7:
politicaldevelopment.cpp: In function 'int main()':
politicaldevelopment.cpp:293:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             assert(v.size() <= k);
                    ~~~~~~~~~^~~~
politicaldevelopment.cpp:298:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for (int i = 0; t && i < v.size(); i++) for (int j = i + 1; t && j < v.size(); j++) if (in(i, mask) && in(j, mask))
                                      ~~^~~~~~~~~~
politicaldevelopment.cpp:298:84: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for (int i = 0; t && i < v.size(); i++) for (int j = i + 1; t && j < v.size(); j++) if (in(i, mask) && in(j, mask))
                                                                                  ~~^~~~~~~~~~
#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...