Submission #772916

#TimeUsernameProblemLanguageResultExecution timeMemory
772916GrindMachineOlympiads (BOI19_olympiads)C++17
0 / 100
110 ms20348 KiB
// Om Namah Shivaya #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; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x, y) ((x + y - 1) / (y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i, n) for(int i = 0; i < n; ++i) #define rep1(i, n) for(int i = 1; i <= n; ++i) #define rev(i, s, e) for(int i = s; i >= e; --i) #define trav(i, a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a, b); } template<typename T> void amax(T &a, T b) { a = max(a, b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* knew beforehand that this problem could be solved using fracturing search saw it here => https://usaco.guide/adv/fracturing-search?lang=cpp#other-problems */ const int MOD = 1e9 + 7; const int N = 500 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; const int K = 6; int n,k,c; int a[N][K]; struct item { vector<int> v; int best = 0; void calc(){ vector<int> curr; rep(i,n){ if(v[i] != -1){ curr.pb(i); } } if(sz(curr) < k){ best = 0; return; } vector<int> mx(k); trav(i,curr){ rep(j,k){ amax(mx[j],a[i][j]); } } best = 0; rep(j,k){ best += mx[j]; } vector<bool> done(k); int guys = 0; trav(i,curr){ if(v[i] == 1){ guys++; rep(j,k){ if(a[i][j] == mx[j]){ done[j] = 1; } } } } trav(i,curr){ if(guys == k) break; if(v[i] == 1) conts; rep(j,k){ if(a[i][j] == mx[j] and !done[j]){ done[j] = 1; v[i] = 1; } } if(v[i] == 1){ guys++; } } trav(i,curr){ if(v[i] != 1 and guys < k){ v[i] = 1; guys++; } } } item(){ v = vector<int>(n); calc(); } item(vector<int> v_){ v = v_; calc(); } }; bool operator<(const item &x, const item &y){ return x.best < y.best; } void solve(int test_case) { cin >> n >> k >> c; rep(i,n) rep(j,k) cin >> a[i][j]; priority_queue<item> pq; pq.push(item()); rep1(id,c){ assert(!pq.empty()); auto curr = pq.top(); pq.pop(); if(id == c){ cout << curr.best << endl; break; } vector<int> use; rep(i,n){ if(curr.v[i] == 1){ use.pb(i); } } assert(sz(use) == k); trav(i,use){ curr.v[i] = -1; pq.push(item(curr.v)); curr.v[i] = 1; } } } int main() { fastio; int t = 1; // cin >> t; rep1(i, t) { solve(i); } return 0; }

Compilation message (stderr)

olympiads.cpp: In member function 'void item::calc()':
olympiads.cpp:80:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   80 |         if(sz(curr) < k){
      |                     ^
In file included from /usr/include/c++/10/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp:45,
                 from /usr/include/c++/10/ext/pb_ds/detail/container_base_dispatch.hpp:90,
                 from /usr/include/c++/10/ext/pb_ds/assoc_container.hpp:48,
                 from olympiads.cpp:4:
olympiads.cpp: In function 'void solve(int)':
olympiads.cpp:176:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  176 |         assert(sz(use) == k);
      |                        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...