Submission #1178064

#TimeUsernameProblemLanguageResultExecution timeMemory
1178064browntoadCarnival Tickets (IOI20_tickets)C++20
0 / 100
293 ms8772 KiB
#include <bits/stdc++.h> #include "tickets.h" using namespace std; #define ll long long // #define int ll #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define REP(i, n) FOR(i, 0, n) #define REP1(i, n) FOR(i, 1, n+1) #define RREP(i, n) for (int i = (n)-1; i >= 0; i--) #define pii pair<int, int> #define pip pair<int, pii> #define f first #define s second #define pb push_back #define ALL(x) (x).begin(), (x).end() #define SZ(x) (int)((x).size()) void make_tickets(vector<vector<int>> nids, vector<vector<int>> pids, int k, int m){ int n = SZ(nids); vector<vector<int>> ans(n); REP(i, n){ ans[i] = vector<int> (m); REP(j, m) ans[i][j] = -1; } REP(t, k){ vector<bool> tmp(n); int cnt = 0; REP(i, n) { if (cnt >= n/2) break; if (SZ(nids[i]) == 0){ ans[i][pids[i].back()] = t; pids[i].pop_back(); cnt++; tmp[i] = 1; } } REP(i, n){ if (cnt >= n/2) break; if (SZ(pids[i]) > 0 && !tmp[i]){ ans[i][pids[i].back()] = t; pids[i].pop_back(); cnt++; tmp[i] = 1; } } REP(i, n){ if (!tmp[i]){ ans[i][nids[i].back()] = t; nids[i].pop_back(); } } } allocate_tickets(ans); } const ll maxn = 85; static ll dp[maxn][maxn*maxn]; static int pre[maxn][maxn*maxn]; long long find_maximum(int k, std::vector<std::vector<int>> x) { int n = x.size(); int m = x[0].size(); std::vector<std::vector<int>> tick(n); // -1 if neg, +1 if pos, 0 if nothing REP(i, n) tick[i] = vector<int> (m); ll sm = 0; REP(i, n){ REP(j, k){ sm -= x[i][j]; } } REP(i, n){ REP(j, n*k/2+1){ // currently how many plus conversions dp[i+1][j] = dp[i][j]; // take all negative here pre[i+1][j] = 0; // means how many i take from i ll cst = 0; REP1(l, k){ if (j-l < 0) break; cst += x[i][m-l] + x[i][k-l]; if (dp[i][j-l] + cst > dp[i+1][j]){ dp[i+1][j] = dp[i][j-l] + cst; pre[i+1][j] = l; } } } } int pus = n*k/2; int fans = dp[n][n*k/2] + sm; RREP(i, n){ int tmp = pre[i+1][pus]; REP(j, k-tmp) tick[i][j] = -1; REP(j, tmp) tick[i][m-j-1] = 1; pus -= tmp; } vector<vector<int>> poo1(n), poo2(n); REP(i, n){ vector<int> t1, t2; REP(j, m){ if (tick[i][j] == -1) t1.pb(j); if (tick[i][j] == 1) t2.pb(j); } poo1[i] = t1; poo2[i] = t2; } make_tickets(poo1, poo2, k, m); return fans; } /* 2 3 2 0 2 5 1 1 3 */
#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...