제출 #300611

#제출 시각아이디문제언어결과실행 시간메모리
300611easrui카니발 티켓 (IOI20_tickets)C++14
0 / 100
2 ms640 KiB
#include "tickets.h" #include <bits/stdc++.h> #define va first #define vb second #define all(x) (x).begin(), (x).end() using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<pii,int> ppi; typedef pair<int,pii> pip; const int MN = 85; const int MOD = 1e9+7; const ll INF = -1e18; int cur[MN],D[MN],U[MN],f[MN][MN]; int n,m; ll S[MN][MN],dp[MN][MN*MN]; bool cmp(int x, int y) { return D[x]<D[y]; } ll find_maximum(int k, vector<vector<int>> x) { n = x.size(); m = x[0].size(); ll sum = 0; vector<vector<int>> ans; vector<int> row(m,-1); for(int i=0; i<n; i++){ ans.push_back(row); } for(int i=0; i<n; i++) for(int j=0; j<m; j++){ S[i][j] = x[i][j]; if(j) S[i][j] += S[i][j-1]; } for(int i=0; i<n; i++){ for(int a=0; a<=n*k/2; a++){ ll cur = -INF; int idx = -1; for(int b=0; b<=min(a,k); b++){ ll tmp = S[i][m-1]; if(i) tmp += dp[i-1][a-b]; else if(a-b) tmp -= INF; if(m-k+b-1>=0) tmp -= S[i][m-k+b-1]; if(b-1>=0) tmp -= S[i][b-1]; if(tmp>cur){ cur = tmp; idx = a-b; } //cout << cur << '\n'; } dp[i][a] = cur; f[i][a] = idx; } } sum = dp[n-1][n*k/2]; int c = n*k/2; for(int i=n-1; i>=0; i--){ D[i] = c-f[i][c]-1; U[i] = m-k+c-f[i][c]; c = f[i][c]; } vector<int> v(n); for(int i=0; i<k; i++){ for(int j=0; j<n; j++) v[j] = j; sort(all(v),cmp); for(int j=0; j<n; j++){ if(j>=n/2){ int c = v[j]; ans[c][D[c]] = i; D[c]--; } else{ int c = v[j]; ans[c][U[c]] = i; U[c]++; } } } for(int i=0; i<n; i++){ assert(D[i]==-1); assert(U[i]==m); } allocate_tickets(ans); return sum; }
#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...