Submission #302338

#TimeUsernameProblemLanguageResultExecution timeMemory
302338bensonlzlHorses (IOI15_horses)C++14
100 / 100
949 ms95516 KiB
#include "horses.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

const ll mod = 1000000007ll;
const ld eps = 1e-9;

ll modinv(ll x){
	ll ans = 1, base = x, exp = mod-2;
	while (exp){
		if (exp & 1) ans *= base;
		base *= base;
		base %= mod;
		ans %= mod;
		exp >>= 1;
	}
	return ans;
}

ll Xval[500005], Yval[500005];
ll Xprod[500005];
ld logX[500005];
int n;

struct node{
	node *left = nullptr, *right = nullptr;
	int s, e;
	ll maxi = 0;
	node(int _s, int _e){
		s = _s;
		e = _e;
		if (s == e){
			maxi = Yval[s];
			return;
		}
		left = new node(s,(s+e)/2);
		right = new node((s+e)/2+1,e);
		maxi = max(left->maxi,right->maxi);
	}
	void update(int x){
		if (s == e){
			maxi = Yval[s];
			return;
		}
		if (x <= (s+e)/2) left->update(x);
		else right->update(x);
		maxi = max(left->maxi,right->maxi);
	}
	ll query(int l, int r){
		if (r < l) return 1;
		if (l > e || r < s) return 1;
		else if (l <= s && e <= r) return maxi;
		return max(left->query(l,r),right->query(l,r));
	}
} *Yroot = nullptr;

set<int> non1X;


ld querylogX(int x){
	ld sum = 0;
	for (; x; x -= (x & -x)) sum += logX[x];
	return sum;
}

ll queryX(int x){
	ll prod = 1;
	for (; x; x -= (x & -x)){
		prod *= Xprod[x];
		prod %= mod;
	}
	return prod;
}

ll solve(){
	//cerr << "SOLVING\n";
	if (non1X.empty()) return Yroot->query(1,n);
	ll lastpos = n;
	ld bestLog = logl(Yroot->query(1,*(non1X.begin())-1));
	ll bestval = Yroot->query(1,*(non1X.begin())-1);
	auto it = (--non1X.end());
	//for (auto it2 : non1X) cerr << it2 << ' ';
	//cerr << '\n';
	for (int i = 0; i < 30; ++i){
		//cerr << bestLog << ' ' << bestval << '\n';
		int pos = *it;
		ld curLog = querylogX(pos) + logl(Yroot->query(pos,lastpos));
		if (curLog > bestLog + eps){
			bestLog = curLog;
			bestval = (queryX(pos) * Yroot->query(pos,lastpos)) % mod;
		}
		lastpos = pos-1;
		if (it == non1X.begin()) break;
		else it--;
	}
	//cerr << bestval << '\n';
	//cerr << "END SOLVING\n";
	return bestval;
}

int init(int N, int X[], int Y[]) {
	n = N;
	for (int i = 1; i <= n; ++i){
		Xprod[i] = Xval[i] = X[i-1];
		Yval[i] = Y[i-1];
		logX[i] = logl(X[i-1]);
		if (Xval[i] != 1) non1X.insert(i);
	}
	for (int i = 1; i < 20; ++i){
		for (int j = (1 << i); j <= n; j += (1 << i)){
			Xprod[j] *= Xprod[j - (1 << (i-1))];
			Xprod[j] %= mod;
			logX[j] += logX[j - (1 << (i-1))];
		}
	}
	Yroot = new node(1,N);
	non1X.insert(1);
	return solve();
}

int updateX(int pos, int val) {	
	pos++;
	ll valc = (modinv(Xval[pos]) * (ll)val)%mod;
	ld lg1 = logl(Xval[pos]), lg2 = logl(val);
	int x = pos;
	for (; x <= n; x += (x & -x)){
		Xprod[x] *= valc;
		Xprod[x] %= mod;
		logX[x] += lg2 - lg1;
	}
	if (Xval[pos] == 1 && val != 1) non1X.insert(pos);
	else if (Xval[pos] != 1 && val == 1) non1X.erase(pos);
	non1X.insert(1);
	Xval[pos] = val; 
	return solve();
}

int updateY(int pos, int val) {
	pos++;
	Yval[pos] = val;
	Yroot->update(pos);
	return solve();
}

Compilation message (stderr)

horses.cpp: In function 'll solve()':
horses.cpp:91:54: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   91 |   ld curLog = querylogX(pos) + logl(Yroot->query(pos,lastpos));
      |                                                      ^~~~~~~
horses.cpp:94:46: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   94 |    bestval = (queryX(pos) * Yroot->query(pos,lastpos)) % mod;
      |                                              ^~~~~~~
horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:122:14: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  122 |  return solve();
      |         ~~~~~^~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:139:14: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  139 |  return solve();
      |         ~~~~~^~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:146:14: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  146 |  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...