Submission #288024

#TimeUsernameProblemLanguageResultExecution timeMemory
2880242qbingxuanJousting tournament (IOI12_tournament)C++17
49 / 100
1071 ms1988 KiB
#include <bits/stdc++.h>
#ifdef local
#define debug(...) qqbx(#__VA_ARGS__, __VA_ARGS__)
template <typename H, typename ...T> void qqbx(const char *s, const H& h, T &&...args) {
    for(; *s && *s != ','; ++s) if(*s != ' ') std::cerr << *s;
    std::cerr << " = " << h << (sizeof...(T) ? ", " : "\n");
    if constexpr(sizeof...(T)) qqbx(++s, args...);
}
#define safe std::cerr<<__PRETTY_FUNCTION__<<" line "<<__LINE__<<" safe\n"
#else
#define debug(...) ((void)0)
#define safe ((void)0)
#endif // local
#define pb emplace_back
#define all(v) begin(v),end(v)

using namespace std;

vector<pair<int,int>> TransferSE(int S[], int E[], int c, int n) {
    vector<int> qq(n, 1);
    vector<int> mx(n);
    iota(all(mx), 0);
    vector<pair<int,int>> res;
    for(int i = 0; i < c; i++) {
        int cnt = 0;
        int L = -1, R = -1;
        for(int j = 0; j < n; j++) if(qq[j]) {
            if(cnt == S[i]) L = j;
            else if(cnt == E[i]) R = mx[j];
            ++cnt;
        }
        for(int j = L+1; j <= R; j++) qq[j] = 0;
        mx[L] = mx[R];
        debug(L, R);
        assert(L!=-1 && R!=-1);
        res.pb(L, R);
    }
    return res;
}
int GetBestPosition(int n, int C, int X, int *K, int *S, int *E) {
    auto segs = TransferSE(S, E, C, n);
    safe;
    vector<tuple<int,bool,int,int>> evt;
    for(int i = 0; i < C; i++) {
        auto [l, r] = segs[i];
        int mx = -1;
        for(int j = l; j < r; j++) mx = max(mx, K[j]);
        debug(l, r, mx);
        evt.pb(l, 1, i, mx);
        evt.pb(r, 0, i, mx);
    }
    sort(all(evt));
    int mx = -1, mxpos = -1;
    set<int> s1, s2;
    for(int i = 0, j; i < evt.size(); i = j) {
        for(j = i; j < evt.size(); j++) {
            if(get<0>(evt[i]) != get<0>(evt[j])) break;
            auto [_, t, pos, val] = evt[j];
            if(t) {
                if(val > X) s1.insert(pos);
                s2.insert(pos);
            } else {
                if(val > X) s1.erase(pos);
                s2.erase(pos);
            }
        }
        int firstLose = s1.size() ? *s1.begin() : C;
        int pos = get<0>(evt[i]);
        debug(firstLose, pos);
        int win = 0;
        for(int x: s2) if(x < firstLose) ++win;
        if(win > mx) {
            mx = win;
            mxpos = get<0>(evt[i]);
        }
    }
    return mxpos;
}

Compilation message (stderr)

tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:55:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, bool, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for(int i = 0, j; i < evt.size(); i = j) {
      |                       ~~^~~~~~~~~~~~
tournament.cpp:56:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, bool, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         for(j = i; j < evt.size(); j++) {
      |                    ~~^~~~~~~~~~~~
tournament.cpp:68:13: warning: unused variable 'pos' [-Wunused-variable]
   68 |         int pos = get<0>(evt[i]);
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...