Submission #832335

#TimeUsernameProblemLanguageResultExecution timeMemory
832335penguinmanCarnival Tickets (IOI20_tickets)C++17
11 / 100
3074 ms7196 KiB
#include "tickets.h" #include <bits/stdc++.h> using std::cin; using std::cout; using std::endl; using std::vector; using std::string; using ll = long long; using vi = vector<ll>; using vii = vector<vi>; using pii = std::pair<ll,ll>; #define ln "\n" #define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++) #define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++) #define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--) #define pb emplace_back #define mp std::make_pair #define mtp std::make_tuple #define all(a) a.begin(),a.end() constexpr ll inf = (1ll<<60); long long find_maximum(int k, std::vector<std::vector<int>> x) { ll N = x.size(); ll M = x[0].size(); vector<vector<int>> ans_allocate(N,vector<int>(M,-1)); ll final_ans = -inf; REP(half,0,N*M){ vector<std::tuple<ll,ll,ll>> data; rep(i,0,N){ rep(j,0,M) data.pb(mtp(x[i][j],i,j)); } sort(all(data)); ll ans = 0; vii left(N), right(N); rep(i,0,half){ ll val, I,J; std::tie(val, I,J) = data[i]; left[I].pb(J); } rep(i,half,N*M){ ll val, I,J; std::tie(val, I,J) = data[i]; right[I].pb(J); } vii use_left(N), use_right(N); ll goal = N*k/2; ll current = 0; std::priority_queue<pii> que; rep(i,0,N){ rep(j,left[i].size(),k){ use_right[i].pb(right[i].back()); right[i].pop_back(); current++; } while(left[i].size() > k) left[i].pop_back(); if(right[i].empty() || left[i].empty()) continue; que.push(mp(x[i][right[i].back()]+x[i][left[i].back()], i)); } /*rep(i,0,N){ cout << "! " << i << ln; for(auto el: left[i]) cout << el << " "; cout << ln; for(auto el: use_right[i]) cout << el << " "; cout << ln; }*/ while(current < goal){ if(que.empty()) break; auto el = que.top(); que.pop(); ll i = el.second; left[i].pop_back(); use_right[i].pb(right[i].back()); right[i].pop_back(); current++; if(right[i].empty() || left[i].empty()) continue; que.push(mp(x[i][right[i].back()]+x[i][left[i].back()], i)); } if(current != goal) continue; use_left = left; vector<vector<int>> allocate(N,vector<int>(M,-1)); vector<pii> cnt(k); rep(i,0,k) cnt[i] = mp(0,i); rep(i,0,N){ sort(all(cnt)); ll idx = 0; for(auto el: use_left[i]){ allocate[i][el] = cnt[idx].second; cnt[idx].first++; idx++; //cout << x[i][el] << " "; ans -= x[i][el]; } for(auto el: use_right[i]){ allocate[i][el] = cnt[idx].second; cnt[idx].first--; idx++; ans += x[i][el]; //cout << " " << x[i][el]; } //cout << ln; } //cout << ans << ln; if(ans > final_ans){ final_ans = ans; ans_allocate = allocate; } } allocate_tickets(ans_allocate); return final_ans; }

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:57:25: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   57 |    while(left[i].size() > k) left[i].pop_back();
      |          ~~~~~~~~~~~~~~~^~~
#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...