Submission #1225331

#TimeUsernameProblemLanguageResultExecution timeMemory
1225331NonozeCarnival Tickets (IOI20_tickets)C++20
11 / 100
1 ms840 KiB
#include "tickets.h" #include <bits/stdc++.h> #define fi first #define se second #define sz(x) (int)x.size() #define cmin(a, b) a=min(a, b) #define cmax(a, b) a=max(a, b) #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define pb push_back #define int long long using namespace std; int n, m, k; vector<vector<int>> a; int find_maximum(signed K, vector<vector<signed>> x) { n=sz(x), m=sz(x[0]), k=K; a.resize(n, vector<int>(m)); for (int i=0; i<n; i++) for (int j=0; j<m; j++) a[i][j]=x[i][j]; vector<int> small(n), big(n); for (int i=0; i<n; i++) { small[i]=a[i][0], big[i]=a[i][0]; for (int j=1; j<m; j++) cmin(small[i], a[i][j]), cmax(big[i], a[i][j]); } int res=0; vector<vector<signed>> ans(n, vector<signed>(m, -1)); if (m==1) { ans.clear(), ans.resize(n, vector<signed>(m, 0)); allocate_tickets(ans); vector<int> b; for (int i=0; i<n; i++) b.pb(a[i][0]); sort(all(b)); for (int i=0; i<n/2; i++) res+=b[n-i-1]-b[i]; return res; } vector<bool> used(n, 0); for (int t=0; t<n/2; t++) { vector<pair<int, int>> mini, maxi; for (int i=0; i<n; i++) if (!used[i]) mini.pb({small[i], i}), maxi.pb({big[i], i}); sort(all(mini)), sort(rall(maxi)); if (mini[0].se!=maxi[0].se) { used[mini[0].se]=used[maxi[0].se]=1; res+=maxi[0].fi-mini[0].fi; for (int j=0; j<m; j++) if (a[mini[0].se][j]==mini[0].fi) { ans[mini[0].se][j]=0; break; } for (int j=0; j<m; j++) if (a[maxi[0].se][j]==maxi[0].fi) { ans[maxi[0].se][j]=0; break; } } else if (maxi[0].fi-mini[1].fi>=maxi[1].fi-mini[0].se) { used[maxi[0].se]=used[mini[1].se]=1; res+=maxi[0].fi-mini[1].fi; for (int j=0; j<m; j++) if (a[mini[1].se][j]==mini[1].fi) { ans[mini[1].se][j]=0; break; } for (int j=0; j<m; j++) if (a[maxi[0].se][j]==maxi[0].fi) { ans[maxi[0].se][j]=0; break; } } else { used[maxi[1].se]=used[mini[0].se]=1; res+=maxi[1].fi-mini[0].fi; for (int j=0; j<m; j++) if (a[mini[0].se][j]==mini[0].fi) { ans[mini[0].se][j]=0; break; } for (int j=0; j<m; j++) if (a[maxi[1].se][j]==maxi[1].fi) { ans[maxi[1].se][j]=0; break; } } } allocate_tickets(ans); return res; }
#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...