제출 #554353

#제출 시각아이디문제언어결과실행 시간메모리
554353Ronin13카니발 티켓 (IOI20_tickets)C++14
11 / 100
2 ms724 KiB
#include "tickets.h" #include <vector> #include <bits/stdc++.h> #define ll long long #define f first #define s second using namespace std; long long find_maximum(int k, std::vector<std::vector<int>> x) { int n = x.size(); int m = x[0].size(); int curf[n], curl[n]; for(int i = 0; i < n; i++){ curf[i] = 0; curl[i] = m - 1; } vector <vector <int> >al; al.resize(n); for(int i = 0; i < n; i++)al[i].resize(m); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++)al[i][j] = -1; } ll ans = 0; int cnt = -1; while(k--){ cnt++; multiset<pair<ll, int> > st; for(int i = 0; i < n; i++){ int a= curf[i], b = curl[i]; st.insert({x[i][a], i}); st.insert({x[i][b], i}); } int used[n]; while(!st.empty()){ pair<ll, int> cur = *st.begin(); st.erase(st.begin()); int ind = cur.s; st.erase(st.find({x[ind][curl[ind]], ind})); if(st.empty()) continue; pair<ll, int> curr = *st.rbegin(); int ind1= curr.s; st.erase(st.find(curr)); st.erase(st.find({x[ind1][curf[ind1]], ind1})); ans += curr.f - cur.f; used[ind] = 0; used[ind1] = 1; } for(int i = 0; i < n; i++){ if(used[i]){ al[i][curl[i]] = cnt; curl[i]--; } else al[i][curf[i]] = cnt, curf[i]++; } } allocate_tickets(al); return ans; }
#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...