Submission #1235807

#TimeUsernameProblemLanguageResultExecution timeMemory
123580712baaterHorses (IOI15_horses)C++20
37 / 100
96 ms17028 KiB
#include "horses.h"
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
typedef long long ll;

const ll MOD = 1E9 + 7;
const int MAXN = 500050;
int n;
vector<int> x(MAXN);
vector<int> y(MAXN);


struct ST {
    int n;
    vector<ll> seg;

    ST(int N) : n(N), seg(2*N) {}

    void update(int pos, int val) {
        pos += n;
        seg[pos] = val;
        pos >>= 1;
        while (pos > 0) {
            seg[pos] = (seg[pos*2] * seg[pos*2 + 1])%MOD;
            pos >>= 1;
        }
    }

    ll query(int l, int r) {
        l += n;
        r += n;
        ll ret = 1;
        while (l < r) {
            if (l&1) { ret *= seg[l++]; ret %= MOD; }
            if (r&1) { ret *= seg[--r]; ret %= MOD; }
            l >>= 1;
            r >>= 1;
        }
        return ret%MOD;
    }
};

ST tree(MAXN);

int find_best(int start) {
    int bestInd = start;
    ll tot = 1;
    for (int i = start+1; i < n; i++) {
        tot *= x[i];
        if (tot * y[i] >= y[bestInd]) {
            bestInd = i;
            tot = 1;
        }
    }
    return bestInd;
}



int solve() {
    int num = max(0, n-32);
    int ind = find_best(num);
    ll horseNum = tree.query(0, ind+1);
    ll cashNum = y[ind];
    // cout << horseNum << " " << cashNum << endl;
    return (tree.query(0, ind+1) * y[ind])%MOD;
}


int init(int N, int X[], int Y[]) {
    n = N;
    for (int i = 0; i < N; i++) {
        x[i] = X[i];
        y[i] = Y[i];
        tree.update(i, x[i]);
    }
	return solve();
}

int updateX(int pos, int val) {
    x[pos] = val;
    tree.update(pos, val);
	return solve();
}

int updateY(int pos, int val) {
    y[pos] = val;
	return solve();
}
#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...