Submission #217511

#TimeUsernameProblemLanguageResultExecution timeMemory
217511dimash241Norela (info1cup18_norela)C++17
100 / 100
7 ms640 KiB
//#pragma GCC target("avx2") //#pragma GCC optimize("O3") //# include <x86intrin.h> # include <bits/stdc++.h> //# include <ext/pb_ds/assoc_container.hpp> //# include <ext/pb_ds/tree_policy.hpp> //using namespace __gnu_pbds; using namespace std; //template<typename T> using ordered_set = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define _USE_MATH_DEFINES_ #define ll long long #define ld long double #define Accepted 0 #define pb push_back #define mp make_pair #define sz(x) (int)(x.size()) #define every(x) x.begin(),x.end() #define F first #define S second #define lb lower_bound #define ub upper_bound #define For(i,x,y) for (ll i = x; i <= y; i ++) #define FOr(i,x,y) for (ll i = x; i >= y; i --) #define SpeedForce ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) // ROAD to... Red inline void Input_Output () { //freopen(".in", "r", stdin); //freopen(".out", "w", stdout); } const double eps = 0.000001; const ld pi = acos(-1); const int maxn = 1e7 + 9; const int mod = 1e9 + 7; const ll MOD = 1e18 + 9; const ll INF = 1e18 + 123; const int inf = 2e9 + 11; const int mxn = 1e6 + 9; const int N = 6e5 + 123; const int M = 22; const int pri = 997; const int Magic = 2101; const int dx[] = {-1, 0, 1, 0}; const int dy[] = {0, -1, 0, 1}; int n, m; vector < int > g[33]; ll mo[33]; map < ll, int > d; int bit_count (ll x) { return __builtin_popcountll(x); } int main () { SpeedForce; cin >> n >> m; for (int i = 0, cur; i < m; ++i) { cin >> cur; g[i].resize(cur); for (auto &e : g[i]) { cin >> e; --e; mo[i] |= (1ll<<e); } } int m1 = m / 2, m2 = m - m1; for (int msk = 0; msk < (1<<m1); msk++) { ll bit = 0; for (int i = 0; i < m1; ++i) { if (msk & (1 << i)) { bit ^= mo[i]; } } if(!d.count(bit) || bit_count(msk) < bit_count(d[bit])) d[bit] = msk; } ll ans = (1ll << m) -1; vector < int > res; for (ll msk = 0; msk < (1<<m2); msk++) { ll bit = 0; for (int i = 0; i < m2; ++i) { if (msk & (1 << i)) { bit ^= mo[i+m1]; } } ll rev = (1ll<<n)-1; rev ^= bit; if(d.count(rev)) { ll now = d[rev] | (msk<<m1); vector < int > cur; for (int i = 0; i < m; ++i) { if(now & (1ll << i)) { cur.pb(i); } } if(res.empty() || bit_count(ans) > bit_count(now)) { ans = now; res = cur; } else if (bit_count(ans) == bit_count(now)) { if(res > cur) { ans = now; res = cur; } } } } assert(res.size()>0); cout << sz(res) << '\n'; for (auto it : res) cout << it+1 << ' '; cout << '\n'; return Accepted; } // B...a
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...