Submission #921088

#TimeUsernameProblemLanguageResultExecution timeMemory
921088shoryu386Olympiads (BOI19_olympiads)C++17
0 / 100
2031 ms40428 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int scores[507][6]; int n, k, c; vector<pair<vector<int>, int>> res1[6]; vector<pair<vector<int>, int>> res2[6]; map<vector<int>, int> store[507][6]; int stop; void recur(int x, int remain, vector<int> cur, int cnt){ //cout << x << ' ' << remain << ' ' << cnt << '\n'; //for (auto y : cur) cout << y << ' '; //cout << "\n\n"; if (x == stop){ res1[remain].push_back({cur, cnt}); return; } store[x+1][remain][cur] += cnt; if (remain != 0){ for (int y = 0; y < k; y++){ cur[y] = max(cur[y], scores[x][y]); } store[x+1][remain-1][cur] += cnt; } } void recur2(int x, int remain, vector<int> cur, int cnt){ //cout << x << ' ' << remain << ' ' << cnt << '\n'; //for (auto y : cur) cout << y << ' '; //cout << "\n\n"; if (x == n){ res2[remain].push_back({cur, cnt}); return; } store[x+1][remain][cur] += cnt; if (remain != 0){ for (int y = 0; y < k; y++){ cur[y] = max(cur[y], scores[x][y]); } store[x+1][remain-1][cur] += cnt; } } main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> c; stop = n/2; for (int x = 0; x < n; x++){ for (int y = 0; y < k; y++){ cin >> scores[x][y]; } } vector<int> init; for (int x = 0; x < k; x++){ init.push_back(LLONG_MIN/20); } store[0][k][init] = 1; for (int x = 0; x <= stop; x++){ for (int y = 0; y <= k; y++){ while (!store[x][y].empty()){ auto vals = *store[x][y].begin(); recur(x, y, vals.first, vals.second); store[x][y].erase(store[x][y].begin()); } } } store[stop][k][init] = 1; for (int x = stop; x <= n; x++){ for (int y = 0; y <= k; y++){ while (!store[x][y].empty()){ auto vals = *store[x][y].begin(); recur2(x, y, vals.first, vals.second); store[x][y].erase(store[x][y].begin()); } } } int ans[100]; memset(ans, 0, sizeof(ans)); for (int x = 0; x <= k; x++){ for (auto r1 : res1[x]){ for (auto r2 : res2[k-x]){ int kek = 0; for (int z = 0; z < k; z++){ kek += max(r1.first[z], r2.first[z]); } ans[kek] += r1.second * r2.second; } } } int sum = 0; for (int x = 99; x > -1; x--){ sum += ans[x]; if (sum >= c){ cout << x; break; } } }

Compilation message (stderr)

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