제출 #741875

#제출 시각아이디문제언어결과실행 시간메모리
741875pavementCouncil (JOI23_council)C++17
40 / 100
4083 ms33108 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; ii vec[(1 << 20) + 5][2], ans[(1 << 20) + 5][2]; void merge(ii a[], ii b[]) { ii c[4], d[4]; c[0] = a[0]; c[1] = a[1]; c[2] = b[0]; c[3] = b[1]; for (int i = 0; i < 4; i++) { swap(c[i].first, c[i].second); d[i] = mp((int)1e9, -1); } sort(c, c + 4); for (int i = 0; i < 4; i++) { if (i == 0 || c[i - 1].first != c[i].first) d[i] = mp(c[i].second, c[i].first); } sort(d, d + 4); a[0] = d[0]; a[1] = d[1]; } main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for (int i = 0; i < (1 << M); i++) { for (int j = 0; j < 2; j++) { vec[i][j] = ans[i][j] = mp((int)1e9, -1); } } 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 (vec[X[i]][0].first == (int)1e9) { vec[X[i]][0] = mp(__builtin_popcount(X[i]), i); } else if (vec[X[i]][1].first == (int)1e9) { vec[X[i]][1] = 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 ii cpy[2]; for (int i = 0; i < 2; i++) { cpy[i] = mp(vec[s ^ m][i].first + __builtin_popcount(s) - __builtin_popcount(m), vec[s ^ m][i].second); } merge(ans[s], cpy); if (s == 0) break; } } 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); } for (auto el : ans[bm]) { 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]++; } } }

컴파일 시 표준 에러 (stderr) 메시지

council.cpp:51:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   51 | 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...