Submission #417177

#TimeUsernameProblemLanguageResultExecution timeMemory
417177JasiekstrzHorses (IOI15_horses)C++17
100 / 100
384 ms49160 KiB
#include<bits/stdc++.h>
#include "horses.h"
#define fi first
#define se second
using namespace std;
const int NN=5e5;
const int PP=53e4;
const long long MOD=1e9+7;
struct Frac
{
	long long a,b;
	bool operator<(const Frac &oth) const
	{
		return a*oth.b<oth.a*b;
	}
};
int n;
int pot;
long long prod;
int tree[2*PP+10];
int x[NN+10];
int y[NN+10];
set<int> st;
long long qp(int a,int b)
{
	if(b==0)
		return 1;
	long long tmp=qp(a,b/2);
	tmp=(tmp*tmp)%MOD;
	if(b%2==1)
		return (tmp*a)%MOD;
	return tmp;
}
void add_t(int g,int c)
{
	g+=pot-1;
	tree[g]=c;
	for(g/=2;g>=1;g/=2)
		tree[g]=max(tree[2*g],tree[2*g+1]);
	return;
}
int read_t(int l,int r)
{
	int ans=0;
	for(l+=pot-1,r+=pot-1;l<=r;l/=2,r/=2)
	{
		if(l%2==1)
			ans=max(ans,tree[l++]);
		if(r%2==0)
			ans=max(ans,tree[r--]);
	}
	return ans;
}
int get_ans()
{
	Frac w={y[n],1};
	long long den=1;
	for(auto it=prev(st.end());true;it--)
	{
		den*=x[*it];
		if(den>=MOD)
			break;
		if(it==st.begin())
		{
			Frac tmp={read_t(1,(*it)-1),den};
			w=max(w,tmp);
			break;
		}
		Frac tmp={read_t(*prev(it),(*it)-1),den};
		w=max(w,tmp);
	}
	//cerr<<prod<<" "<<w.a<<" "<<w.b<<"\n";
	return (((prod*w.a)%MOD)*qp(w.b,MOD-2))%MOD;
}
int init(int N,int X[],int Y[])
{
	n=N;
	for(int i=0;i<n;i++)
	{
		x[i+1]=X[i];
		y[i+1]=Y[i];
	}
	for(pot=1;pot<n;pot*=2);
	for(int i=1;i<=n;i++)
		tree[pot+i-1]=y[i];
	for(int i=pot-1;i>=1;i--)
		tree[i]=max(tree[2*i],tree[2*i+1]);
	prod=1;
	for(int i=1;i<=n;i++)
	{
		prod*=x[i];
		prod%=MOD;
		if(x[i]>1 || i==n)
			st.insert(i);
	}
	return get_ans();
}
int updateX(int pos,int val)
{
	prod=(prod*qp(x[pos+1],MOD-2))%MOD;
	prod=(prod*val)%MOD;
	x[pos+1]=val;
	st.erase(pos+1);
	if(val>1 || pos+1==n)
		st.insert(pos+1);
	return get_ans();
}
int updateY(int pos,int val)
{
	y[pos+1]=val;
	add_t(pos+1,val);
	return get_ans();
}

Compilation message (stderr)

horses.cpp: In function 'int get_ans()':
horses.cpp:73:32: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   73 |  return (((prod*w.a)%MOD)*qp(w.b,MOD-2))%MOD;
      |                              ~~^
horses.cpp:73:41: warning: conversion from 'long long int' to 'int' may change value [-Wconversion]
   73 |  return (((prod*w.a)%MOD)*qp(w.b,MOD-2))%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...