Submission #1302278

#TimeUsernameProblemLanguageResultExecution timeMemory
1302278nicolo_010Horses (IOI15_horses)C++20
17 / 100
1597 ms16004 KiB
#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int MOD = 1e9+7;

const ll INF = 1e18;

vector<ll> x;
vector<ll> y;
int n;

ll compute(vector<ll> a, vector<ll> b) {
	int idx=0;
	ll prod=1;
	bool moduled = false;
	for (int i=1; i<(int)a.size(); i++) {
		ll y0 = b[idx];
		ll y1 = b[i];
		prod *= x[i];
		if (prod >= MOD) {
			moduled = true;
			prod %= MOD;
		}
		if (moduled) {
			//Se que y[i] <= y[j]*prod
			//Conviene j
			idx = i;
			moduled = 0;
			prod = 1;
		}
		else {
			if (prod*y1 >= y0) {
				idx = i;
				prod = 1;
				moduled = false;
			}
		}
	}
	prod=a[0];
	for (int i=1; i<n; i++) {
		if (i > idx) break;
		prod *= a[i];
		prod %= MOD;
	}
	return (prod*b[idx]) % MOD;
}

int init(int N, int* a, int* b) {
	n = N;
	x.assign(n, 0);
	y.assign(n, 0);
	for (int i=0; i<n; i++) {
		x[i] = a[i];
		y[i] = b[i];
	}
	x.push_back(1);
	y.push_back(0);
	ll ans=x[0]*y[0];
	ll prod=x[0];
	for (int i=0; i<n; i++) {
		prod *= x[i+1];
		prod %= MOD;
		if (y[i+1] > y[i]/x[i+1]) {
			ans = prod*y[i+1];
		}
	}
	return ans%MOD;
}

int updateX(int pos, int val) {
	x[pos] = val;
	ll ans=x[0]*y[0];
	ll prod=x[0];
	for (int i=0; i<n; i++) {
		prod *= x[i+1];
		prod %= MOD;
		if (y[i+1] > y[i]/x[i+1]) {
			ans = prod*y[i+1];
		}
	}
	return ans%MOD;
}

int updateY(int pos, int val) {
	y[pos] = val;
	ll ans=x[0]*y[0];
	ll prod=x[0];
	for (int i=0; i<n; i++) {
		prod *= x[i+1];
		prod %= MOD;
		if (y[i+1] > y[i]/x[i+1]) {
			ans = prod*y[i+1];
		}
	}
	return ans%MOD;
}
#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...