제출 #808393

#제출 시각아이디문제언어결과실행 시간메모리
808393drdilyor카니발 티켓 (IOI20_tickets)C++17
0 / 100
1 ms340 KiB
#include<bits/stdc++.h>
#include "tickets.h"
using namespace std;
using ll = long long;
const int inf = 1e9;

#ifdef ONPC
#define debug(args...) {cout << "[" << #args << "]: "; debug_out(args);}
#else
#define debug(args...) {42;}
#endif

void debug_out() {
    cout << endl;
}
template<typename H, typename... T>
void debug_out(vector<H> h, T... t) {
    cout << "{";
    for (H i : h) cout << i << ", ";
    cout << "}, ";
    debug_out(t...);
}
template<typename H, typename... T>
void debug_out(H h, T... t) {
    cout << h << ", ";
    debug_out(t...);
}

long long find_maximum(int k, std::vector<std::vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
    vector<tuple<int,int,int>> pos(n);
    for (int i = 0; i < n; i++)
        pos[i] = {-x[i][0], x[i][m-1], i};

    sort(pos.begin(), pos.end(), [&](auto a, auto b) {
            return get<1>(a) - get<0>(a) > get<1>(b) - get<0>(b);
    });

    int space = m - k;
    vector score(n, vector<ll>());
    for (int i = 0; i < n; i++) {
        ll cur = accumulate(x[i].begin(), x[i].end(), 0ll);
        ll base = cur;
        if (!space) score[i].push_back(0);
        for (int j = 0; j < m; j++) {
            cur -= x[i][j];
            if (j >= space) {
                cur += -x[i][j - space];
            }
            if (j >= space-1)
                score[i].push_back(cur - base);
        }
        assert((int)score[i].size() == k + 1);
        debug(i, score[i]);
    }

    vector<int> use(n);

    constexpr ll infl = 1e18;
    ll lb = -infl, rb = 1;
    while (lb < rb-1) {
        ll mid = (lb+ rb) / 2;
        int cnt = 0;
        for (int i = 0; i < n; i++)
            cnt += upper_bound(score[i].begin(), score[i].end(), mid, greater()) - score[i].begin() - 1;
        if (cnt >= n / 2 * k)
            lb = mid;
        else rb = mid;
    }
    ll mid = lb;
    int rem = n / 2 * k;
    for (int i = 0; i < n; i++) {
        use[i] = lower_bound(score[i].begin(), score[i].end(), mid, greater()) - score[i].begin();
        rem -= use[i];
    }
    debug(rem, use);
    for (int i = 0; i < n; i++) {
        int eq = upper_bound(score[i].begin(), score[i].end(), mid) - score[i].begin() - use[i];
        use[i] += min(eq, rem);
        rem -= min(eq, rem);
    }

    debug(use);

    vector type(n, vector<int>(m, 0));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < use[i]; j++)
            type[i][j] = -1;
        for (int j = 0; j < k - use[i]; j++)
            rbegin(type[i])[j] = 1;
    }

    ll sum = 0;
    vector ans(n, vector<int>(m, -1));
    int round_low = 0;
    for (int i = 0; i < n; i++) {
        debug(i, ans[i]);
        for (int j = 0; j < m; j++) {
            if (type[i][j] == -1) {
                sum -= x[i][j];
                ans[i][j] = round_low++;
                if (round_low >= k) round_low -= k;
            }
        }
        int round = round_low;
        for (int j = 0; j < m; j++) {
            if (type[i][j] == 1) {
                sum += x[i][j];
                ans[i][j] = round++;
                if (round >= k) round -= k;
            }
        }
        debug(i, ans[i]);
    }
    allocate_tickets(ans);
    return sum;
}

컴파일 시 표준 에러 (stderr) 메시지

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
   10 | #define debug(args...) {42;}
      |                         ^~
tickets.cpp:55:9: note: in expansion of macro 'debug'
   55 |         debug(i, score[i]);
      |         ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
   10 | #define debug(args...) {42;}
      |                         ^~
tickets.cpp:77:5: note: in expansion of macro 'debug'
   77 |     debug(rem, use);
      |     ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
   10 | #define debug(args...) {42;}
      |                         ^~
tickets.cpp:84:5: note: in expansion of macro 'debug'
   84 |     debug(use);
      |     ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
   10 | #define debug(args...) {42;}
      |                         ^~
tickets.cpp:98:9: note: in expansion of macro 'debug'
   98 |         debug(i, ans[i]);
      |         ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
   10 | #define debug(args...) {42;}
      |                         ^~
tickets.cpp:114:9: note: in expansion of macro 'debug'
  114 |         debug(i, ans[i]);
      |         ^~~~~
#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...