Submission #288052

# Submission time Handle Problem Language Result Execution time Memory
288052 2020-09-01T08:19:24 Z 2qbingxuan Jousting tournament (IOI12_tournament) C++17
100 / 100
174 ms 11820 KB
#include <bits/extc++.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;
using namespace __gnu_pbds;
template <typename T> using rbt = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int N = 100025;

vector<pair<int,int>> TransferSE(int S[], int E[], int c, int n) {
    vector<int> mx(n);
    iota(all(mx), 0);
    vector<pair<int,int>> res;
    rbt<int> QQ;
    for(int i = 0; i < n; i++) QQ.insert(i);
    for(int i = 0; i < c; i++) {
        int cnt = 0;
        auto itl = QQ.find_by_order(S[i]);
        auto itr = QQ.find_by_order(E[i]);
        int L = *itl;
        int R = mx[*itr];
        debug(L, R, i);
        ++itl, ++itr;
        for(auto it = itl; it != itr; QQ.erase(it++));
        safe;
        // QQ.erase(next(itl), next(itr));
        mx[L] = mx[R];
        debug(L, R);
        assert(L!=-1 && R!=-1);
        res.pb(L, R);
    }
    return res;
}


struct FenwickTree {
    int sum[N];
    void add(int p, int d) {
        for(++p; p < N; p+=p&-p) sum[p] += d;
    }
    int query(int p) {
        int r = 0;
        for(++p; p > 0; p -= p&-p) r += sum[p];
        return r;
    }
} fwt;
struct SegmentTree {
    int mx[N<<1], n;
    void init(int v[], int _n) {
        n = _n;
        for(int i = 0; i < n; i++) mx[i+n] = v[i];
        for(int i = n-1; i > 0; i--) mx[i] = max(mx[i<<1], mx[i<<1|1]);
    }
    int getmx(int l, int r) {
        int res = 0;
        for(l+=n,r+=n; l<r; l>>=1,r>>=1) {
            if(l&1) res = max(res, mx[l++]);
            if(r&1) res = max(res, mx[--r]);
        }
        return res;
    }
} sgt;
int GetBestPosition(int n, int C, int X, int *K, int *S, int *E) {
    auto segs = TransferSE(S, E, C, n);
    safe;

    sgt.init(K, n-1);
    vector<tuple<int,bool,int,int>> evt;
    for(int i = 0; i < C; i++) {
        auto [l, r] = segs[i];
        int mx = sgt.getmx(l, r);
        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> s;
    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) s.insert(pos);
                fwt.add(pos, 1);
            } else {
                if(val > X) s.erase(pos);
                fwt.add(pos, -1);
            }
        }
        int firstLose = s.size() ? *s.begin() : C;
        int pos = get<0>(evt[i]);
        int win = fwt.query(firstLose-1);
        if(win > mx) {
            mx = win;
            mxpos = pos;
        }
    }
    return mxpos;
}

Compilation message

tournament.cpp: In function 'std::vector<std::pair<int, int> > TransferSE(int*, int*, int, int)':
tournament.cpp:29:13: warning: unused variable 'cnt' [-Wunused-variable]
   29 |         int cnt = 0;
      |             ^~~
tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:92: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]
   92 |     for(int i = 0, j; i < evt.size(); i = j) {
      |                       ~~^~~~~~~~~~~~
tournament.cpp:93: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]
   93 |         for(j = i; j < evt.size(); j++) {
      |                    ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 512 KB Output is correct
2 Correct 7 ms 1024 KB Output is correct
3 Correct 4 ms 640 KB Output is correct
4 Correct 6 ms 1024 KB Output is correct
5 Correct 6 ms 1024 KB Output is correct
6 Correct 5 ms 768 KB Output is correct
7 Correct 6 ms 1024 KB Output is correct
8 Correct 6 ms 1024 KB Output is correct
9 Correct 3 ms 640 KB Output is correct
10 Correct 8 ms 1024 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 67 ms 4140 KB Output is correct
2 Correct 174 ms 11184 KB Output is correct
3 Correct 89 ms 7024 KB Output is correct
4 Correct 161 ms 9448 KB Output is correct
5 Correct 155 ms 10144 KB Output is correct
6 Correct 154 ms 8556 KB Output is correct
7 Correct 165 ms 11820 KB Output is correct
8 Correct 164 ms 10328 KB Output is correct
9 Correct 94 ms 6768 KB Output is correct
10 Correct 91 ms 7024 KB Output is correct