제출 #800330

#제출 시각아이디문제언어결과실행 시간메모리
800330becaidoCarnival Tickets (IOI20_tickets)C++17
16 / 100
425 ms51916 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,popcnt,sse4,abm") #include <bits/stdc++.h> using namespace std; #ifndef WAIMAI #include "tickets.h" #endif #ifdef WAIMAI #define debug(HEHE...) cout << "[" << #HEHE << "] : ", dout(HEHE) void dout() {cout << '\n';} template<typename T, typename...U> void dout(T t, U...u) {cout << t << (sizeof...(u) ? ", " : ""), dout(u...);} #else #define debug(...) 7122 #endif #define ll long long #define Waimai ios::sync_with_stdio(false), cin.tie(0) #define FOR(x,a,b) for (int x = a, I = b; x <= I; x++) #define pb emplace_back #define F first #define S second #ifdef WAIMAI void allocate_tickets( vector<vector<int>> _x); #endif const int SIZE = 1505; int id[SIZE], L[SIZE], R[SIZE]; vector<pair<int, int>> v; pair<int, int> ind[SIZE]; ll find_maximum(int k, vector<vector<int>> x) { int n = x.size(); int m = x[0].size(); vector<vector<int>> ans; ans.resize(n, vector<int>(m, -1)); FOR (i, 0, n - 1) L[i] = 0, R[i] = m - 1; ll sum = 0; FOR (t, 0, k - 1) { if (L[0] == R[0]) { iota(id, id + n, 0); sort(id, id + n, [&](int l, int r) { return x[l][L[l]] < x[r][L[r]]; }); ll sum = 0; FOR (i, 0, n / 2 - 1) sum -= x[id[i]][L[id[i]]]; FOR (i, n / 2, n - 1) sum += x[id[i]][L[id[i]]]; FOR (i, 0, n - 1) ans[i][L[i]] = t; break; } v.clear(); FOR (i, 0, n - 1) { v.pb(x[i][L[i]], i); v.pb(x[i][R[i]], i); ind[i] = {-1, -1}; } sort(v.begin(), v.end()); FOR (i, 0, v.size() - 1) { auto [x, p] = v[i]; if (ind[p].F == -1) ind[p].F = i; else ind[p].S = i; } int sml = 0, big = 0; vector<pair<int, int>> delta; FOR (i, 0, n - 1) { auto [l, r] = ind[i]; if (r < n) { sml++; sum -= x[i][L[i]]; ans[i][L[i]] = t; L[i]++; } else if (l > n) { big++; sum += x[i][R[i]]; ans[i][R[i]] = t; R[i]--; } else { big++; sum += x[i][R[i]]; ans[i][R[i]] = t; delta.pb(-x[i][L[i]] - x[i][R[i]], i); R[i]--; } } sort(delta.begin(), delta.end()); while (big > sml) { auto [d, i] = delta.back(); delta.pop_back(); big--, sml++; R[i]++; ans[i][R[i]] = -1, ans[i][L[i]] = t; sum += d; L[i]--; } } allocate_tickets(ans); return sum; } /* in1 2 3 2 0 2 5 1 1 3 out1 7 0 -1 1 -1 1 0 in2 4 2 1 5 9 1 4 3 6 2 7 out2 12 -1 0 0 -1 0 -1 -1 0 */ #ifdef WAIMAI static int n; static int m; static int k; static vector<vector<int>> d; static vector<vector<int>> x; static int called = 0; static void check(bool cond, string message) { if (!cond) { printf("%s\n", message.c_str()); exit(0); } } void allocate_tickets( vector<vector<int>> _d) { check(!called, "allocate_tickets called more than once"); d = _d; check((int)d.size() == n, "allocate_tickets called with parameter of wrong size"); for (int i = 0; i < n; i++) { check((int)d[i].size() == m, "allocate_tickets called with parameter of wrong size"); } called = 1; } int main() { assert(scanf("%d %d %d", &n, &m, &k) == 3); x.resize(n); for (int i = 0; i < n; i++) { x[i].resize(m); for (int j=0; j < m; j++) { assert(scanf("%d", &x[i][j]) == 1); } } fclose(stdin); ll ans = find_maximum(k, x); check(called, "failure to call allocate_tickets"); printf("%lld\n", ans); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (j) printf(" "); printf("%d", d[i][j]); } printf("\n"); } fclose(stdout); return 0; } #endif
#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...