Submission #60091

#TimeUsernameProblemLanguageResultExecution timeMemory
60091Flugan42Horses (IOI15_horses)C++14
0 / 100
17 ms8504 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double Ld; typedef vector<ll> vi; typedef pair<ll,ll> ii; typedef vector<ii> vii; #define rep(i,a,b) for(ll i = a; i < b; i++) #define per(i,a,b) for(ll i = a; i >= b; i--) #define all(x) x.begin(),x.end() #define inf 1000000000000000000 #define sz(x) (ll)(x).size() const ll mod = 1000000007; ll pw(ll a, ll x){ if (x == 0) return 1; if (x == 1) return a%mod; ll temp = pw(a,x/2); if (x%2) return (((temp*temp)%mod)*a)%mod; else return ((temp*temp)%mod); } class segT { private: vector<pair<Ld,ll> > tree; vector<Ld> a; ll n; ll left(ll v) { return 2*v; } ll right(ll v) { return 2*v+1; } void build(ll v, ll l, ll r){ if (l == r) tree[v] = make_pair(a[l],l); else { build(left(v),l,(l+r)/2); build(right(v),(l+r)/2+1,r); if (tree[left(v)].first > tree[right(v)].first) tree[v] = tree[left(v)]; else tree[v] = tree[right(v)]; } } pair<Ld,ll> rmq(ll v, ll l, ll r, ll i, ll j){ if (l > j || r < i) return make_pair(-1,-1); if (i <= l && r <= j) return tree[v]; else { pair<Ld,ll> p1 = rmq(left(v),l,(l+r)/2,i,j); pair<Ld,ll> p2 = rmq(right(v),(l+r)/2+1,r,i,j); if (p1.first == -1 && p2.first == -1) return make_pair(-1,-1); if (p1.first == -1) return p2; if (p2.first == -1) return p1; if (p1.first > p2.first) return p1; else return p2; } } void rangeadd(ll v, ll l, ll r, ll i, ll j, Ld val){ if (l > j || r < i) return; if (i <= l && r <= j) tree[v] = make_pair(tree[v].first+val,tree[v].second); else { rangeadd(left(v), l, (l+r)/2, i, j, val); rangeadd(right(v), (l+r)/2+1, r, i, j, val); if (tree[left(v)].first > tree[right(v)].first) tree[v] = tree[left(v)]; else tree[v] = tree[right(v)]; } } public: void build(vector<Ld> &_a){ a = _a; n = sz(_a); tree.assign(4*n,make_pair(0.0,0)); build(1,0,n-1); } pair<Ld,ll> rmq(ll i, ll j) { return rmq(1,0,n-1,i,j); } void rangeadd(ll i, ll j, Ld val) { rangeadd(1,0,n-1,i,j,val); } } ; class segTp { private: vi tree,a; ll n; ll left(ll v) { return 2*v; } ll right(ll v) { return 2*v+1; } void build(ll v, ll l, ll r){ if (l == r) tree[v] = a[l]; else { build(left(v),l,(l+r)/2); build(right(v),(l+r)/2+1,r); tree[v] = (tree[left(v)]*tree[right(v)])%mod; } } ll rmq(ll v, ll l, ll r, ll i, ll j){ if (l > j || r < i) return -1; if (i <= l && r <= j) return tree[v]; else { ll p1 = rmq(left(v),l,(l+r)/2,i,j); ll p2 = rmq(right(v),(l+r)/2+1,r,i,j); if (p1 == -1 && p2 == -1) return -1; if (p1 == -1) return p2; if (p2 == -1) return p1; return (p1*p2)%mod; } } void rangeprod(ll v, ll l, ll r, ll i, ll j, ll val){ if (l > j || r < i) return; if (i <= l && r <= j) tree[v] = (tree[v]*pw(val,(r-l+1)))%mod; else { rangeprod(left(v), l, (l+r)/2, i, j, val); rangeprod(right(v), (l+r)/2+1, r, i, j, val); tree[v] = (tree[left(v)]*tree[right(v)])%mod; } } public: void build(vi &_a){ a = _a; n = sz(_a); tree.assign(4*n,0); build(1,0,n-1); } ll rmq(ll i, ll j) { return rmq(1,0,n-1,i,j); } void rangeprod(ll i, ll j, ll val) { rangeprod(1,0,n-1,i,j,val); } } ; vi inp,YY; vector<Ld> lnsum; pair<Ld,ll> res; segT myT; segTp pT; ll NN; int init(int N, int X[], int Y[]) { inp[0] = X[0]%mod; lnsum[0] = log(Ld(X[0])); rep(i,0,N) YY.push_back(ll(Y[i])); rep(i,1,N){ inp[i] = (inp[i-1]*X[0])%mod; lnsum[i] = lnsum[i-1]+log(X[i]); } rep(i,0,N){ lnsum[i] += log(Y[i]); } myT.build(lnsum); pT.build(inp); res = myT.rmq(0,N-1); NN = N; return (pT.rmq(0,res.second)*YY[res.second])%mod; } int updateX(int pos, int val) { myT.rangeadd(0,pos,log(val)); pT.rangeprod(pos,pos,val); res = myT.rmq(0,NN-1); return (pT.rmq(0,res.second)*YY[res.second])%mod; } int updateY(int pos, int val) { myT.rangeadd(pos,pos,log(val)); res = myT.rmq(0,NN-1); return (pT.rmq(0,res.second)*YY[res.second])%mod; }

Compilation message (stderr)

horses.cpp: In function 'int init(int, int*, int*)':
horses.cpp:143:46: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return (pT.rmq(0,res.second)*YY[res.second])%mod;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
horses.cpp: In function 'int updateX(int, int)':
horses.cpp:150:46: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return (pT.rmq(0,res.second)*YY[res.second])%mod;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
horses.cpp: In function 'int updateY(int, int)':
horses.cpp:156:46: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
  return (pT.rmq(0,res.second)*YY[res.second])%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...