Submission #741874

#TimeUsernameProblemLanguageResultExecution timeMemory
741874pavementCouncil (JOI23_council)C++17
40 / 100
4094 ms69036 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; //~ #define int long long #define mp make_pair #define mt make_tuple #define pb push_back #define ppb pop_back #define eb emplace_back #define g0(a) get<0>(a) #define g1(a) get<1>(a) #define g2(a) get<2>(a) #define g3(a) get<3>(a) #define g4(a) get<4>(a) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); using db = double; using ll = long long; using ld = long double; using ii = pair<int, int>; using iii = tuple<int, int, int>; using iiii = tuple<int, int, int, int>; using iiiii = tuple<int, int, int, int, int>; template<class key, class value = null_type, class cmp = less<key> > using ordered_set = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>; int N, M, X[300005], cnt[25]; bool b; basic_string<ii> vec[(1 << 20) + 5], ans[(1 << 20) + 5]; void merge(basic_string<ii> &a, basic_string<ii> &b) { basic_string<ii> tmp, tmp2; for (auto el : a) tmp.pb(mp(el.second, el.first)); for (auto el : b) tmp.pb(mp(el.second, el.first)); sort(tmp.begin(), tmp.end()); for (int i = 0; i < (int)tmp.size(); i++) { if (i == 0 || tmp[i - 1].first != tmp[i].first) tmp2.pb(mp(tmp[i].second, tmp[i].first)); } sort(tmp2.begin(), tmp2.end()); while (tmp2.size() > 2) tmp2.ppb(); a.clear(); for (auto el : tmp2) a.pb(el); } main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for (int i = 1; i <= N; i++) { for (int j = 0; j < M; j++) { cin >> b; X[i] |= (1 << j) * b; cnt[j] += b; } if ((int)vec[X[i]].size() < 2) vec[X[i]].pb(mp(__builtin_popcount(X[i]), i)); } for (int m = 0; m < (1 << M); m++) { for (int s = m; ; s = (s - 1) & m) { merge(vec[s], vec[m]); if (s == 0) break; } } for (int m = 0; m < (1 << M); m++) { for (int s = m; ; s = (s - 1) & m) { // bm = s, k = m basic_string<ii> cpy; for (auto el : vec[s ^ m]) cpy.pb(mp(el.first + __builtin_popcount(s) - __builtin_popcount(m), el.second)); merge(ans[s], cpy); if (s == 0) break; } } //~ for (int i = 0; i < (1 << M); i++) { //~ cout << "@ " << i << '\n'; //~ for (auto el : ans[i]) cout << el.first << ' ' << el.second << '\n'; //~ } for (int i = 1; i <= N; i++) { int cur = 0, bm = 0; for (int j = 0; j < M; j++) { if (X[i] & (1 << j)) cnt[j]--; } for (int j = 0; j < M; j++) { if (cnt[j] > N / 2) cur++; else if (cnt[j] == N / 2) cur++, bm |= (1 << j); } //~ cout << "BM: " << bm << '\n'; for (auto el : ans[bm]) { //~ cout << el.first << ' ' << el.second << '\n'; if (el.second != i) { cur -= el.first; break; } } cout << cur << '\n'; for (int j = 0; j < M; j++) { if (X[i] & (1 << j)) cnt[j]++; } } }

Compilation message (stderr)

council.cpp:46:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   46 | main() {
      | ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...