제출 #303059

#제출 시각아이디문제언어결과실행 시간메모리
303059tutis카니발 티켓 (IOI20_tickets)C++17
62 / 100
1381 ms2097156 KiB
#include "tickets.h" #include <vector> #include <bits/stdc++.h> using namespace std; long long find_maximum(int k, vector<vector<int>> x) { int n = x.size(); int m = x[0].size(); vector<vector<int>> answer(n, vector<int>(m, -1)); long long ret = 0; int mxp = n / 2 * k; pair<long long, int> mx[n + 1][mxp + 1]; for (int i = 0; i <= n; i++) for (int j = 0; j <= mxp; j++) mx[i][j] = { -1e18, 0}; long long del[n][k + 1]; for (int i = 0; i < n; i++) { long long d = 0; for (int c = 0; c < k; c++) d -= x[i][c]; for (int p = 0; p <= k; p++) { del[i][p] = d; d += x[i][k - 1 - p]; d += x[i][m - 1 - p]; } } mx[0][0] = {0, 0}; for (int i = 1; i <= n; i++) { for (int a = 0; a <= mxp; a++) { int lo = 0; int hi = min(k, a); while (hi - lo + 1 >= 5) { int p = (lo + hi) / 2; int p1 = p + 1; long long v = mx[i - 1][a - p].first + del[i - 1][p]; long long v1 = mx[i - 1][a - p1].first + del[i - 1][p1]; if (v1 >= v) lo = p1; else hi = p; } for (int p = lo; p <= hi; p++) { mx[i][a] = max(mx[i][a], {mx[i - 1][a - p].first + del[i - 1][p], p}); } } } int p = mxp; int M[n], P[n]; ret = mx[n][p].first; for (int i = n - 1; i >= 0; i--) { int pp = mx[i + 1][p].second; p -= pp; P[i] = pp; M[i] = k - P[i]; } int a[n]; int b[n]; for (int i = 0; i < n; i++) { a[i] = 0; b[i] = m - 1; } for (int g = 0; g < k; g++) { pair<int, int>x[n]; for (int i = 0; i < n; i++) x[i] = {P[i], i}; sort(x, x + n); for (int i = 0; i < n / 2; i++) { int id = x[i].second; answer[id][a[id]] = g; a[id]++; M[id]--; } for (int i = n / 2; i < n; i++) { int id = x[i].second; answer[id][b[id]] = g; b[id]--; P[id]--; } } allocate_tickets(answer); return ret; }
#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...