Submission #719539

#TimeUsernameProblemLanguageResultExecution timeMemory
719539thimote75Horses (IOI15_horses)C++14
100 / 100
378 ms74824 KiB
#include "horses.h"

#include <bits/stdc++.h>
using namespace std;

#define ld long double
#define num long long
#define inf 1e9

const num MOD = 1e9 + 7;

vector<num> X;
vector<num> Y;

struct SGD {
	ld mx_ls = - inf;
	ld se_ls = - inf;

	num mx_pv = 0;
	num se_pv = 0;

	void merge (SGD &l, SGD &r) {
		se_ls = l.se_ls + r.se_ls;
		se_pv = (l.se_pv * r.se_pv) % MOD;

		mx_ls = max(l.mx_ls, r.mx_ls + l.se_ls);

		if (mx_ls == l.mx_ls) mx_pv = l.mx_pv;
		else mx_pv = (l.se_pv * r.mx_pv) % MOD;
	}
};

struct SegTree {
	int size, start, height;
	vector<SGD> tree;

	SegTree (int _size) {
		size = _size;
		height = ceil(log2(size));
		start = 1 << height;

		tree.resize(start << 1);
	}
	num query () {
		return tree[1].mx_pv;
	}
	void _update (int index) {
		if (index == 0) return ;

		if (index < start) {
			int n0 = index << 1;
			int n1 = n0 + 1;

			tree[index].merge(tree[n0], tree[n1]);
		}

		_update(index >> 1);
	}
	void update (int pos, num x, num y) {
		pos += start;

		tree[pos].se_ls = log((ld) x);
		tree[pos].mx_ls = log((ld) x) + log((ld) y);

		tree[pos].se_pv = x;
		tree[pos].mx_pv = (x * y) % MOD;

		_update(pos);
	}

	void show () {
		for (int h = 0; h <= height; h ++) {
			int s = 1 << h;
			for (int i = 0; i < s; i ++) {
				cout << tree[i + s].mx_pv << ":" << tree[i + s].se_pv << "/e" << tree[i + s].mx_ls << ":e" << tree[i + s].se_ls << " ";
			}
			cout << endl;
		}
	}
};

SegTree tree(1);
int compute () {
	return max(1, (int) tree.query());
}

int init(int N, int _X[], int _Y[]) {
	X.resize(N);
	Y.resize(N);

	tree = SegTree(N);

	for (int i = 0; i < N; i ++) {
		X [i] = _X[i];
		Y [i] = _Y[i];

		tree.update(i, X[i], Y[i]);
	}

	return compute();
}

int updateX(int i, int val) {
	X [i] = val;
	tree.update(i, X[i], Y[i]);
	return compute();
}

int updateY(int i, int val) {
	Y [i] = val;
	tree.update(i, X[i], Y[i]);
	return compute();
}

Compilation message (stderr)

horses.cpp: In constructor 'SegTree::SegTree(int)':
horses.cpp:39:16: warning: conversion from 'double' to 'int' may change value [-Wfloat-conversion]
   39 |   height = ceil(log2(size));
      |            ~~~~^~~~~~~~~~~~
#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...