Submission #928046

#TimeUsernameProblemLanguageResultExecution timeMemory
928046VMaksimoski008Horses (IOI15_horses)C++14
17 / 100
65 ms69456 KiB
#include <bits/stdc++.h> #include "horses.h" #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; using Node = pair<double, int>; const int mod = 1e9 + 7; const int maxn = 1e5 + 5; int n; vector<ll> X(5*maxn), Y(maxn), PS(5*maxn); vector<double> logX(5*maxn), logY(maxn), PL(5*maxn); ll exp(ll a, ll b) { ll ans = 1; while(b) { if(b & 1) ans = (ans * a) % mod; a = (a * a) % mod; b /= 2; } return ans; } ll inv(ll x) { return exp(x, mod-2); } Node merge(Node a, Node b) { if(a.first > b.first) return a; return b; } struct SegTree { int N; vector<ll> prod; vector<Node> tree; void init() { N = n; prod.resize(4*N+5); tree.resize(4*N+5); build(1, 0, N-1); } void build(int u, int tl, int tr) { if(tl == tr) { tree[u] = { PL[tl] + logY[tl], tl }; prod[u] = X[tl]; } else { int tm = (tl + tr) / 2; build(2*u, tl, tm); build(2*u+1, tm+1, tr); prod[u] = (prod[2*u] * prod[2*u+1]) % mod; tree[u] = merge(tree[2*u], tree[2*u+1]); } } void updateProd(int u, int tl, int tr, int pos, int val) { if(tl == tr) { prod[u] = val; } else { int tm = (tl + tr) / 2; if(pos <= tm) updateProd(2*u, tl, tm, pos, val); else updateProd(2*u+1, tm+1, tr, pos, val); prod[u] = (prod[2*u] * prod[2*u+1]) % mod; } } ll getProd(int u, int tl, int tr, int l, int r) { if(tl > tr || l > tr || tl > r) return 1; if(l <= tl && tr <= r) return prod[u]; int tm = (tl + tr) / 2; return ( getProd(2*u, tl, tm, l, r) * getProd(2*u+1, tm+1, tr, l, r) ) % mod; } void updateProd(int pos, int val) { updateProd(1, 0, N-1, pos, val); } ll getProd(int p) { return getProd(1, 0, N-1, 0, p); } int getPos() { return tree[1].second; } } tree; int calc() { int pos = tree.getPos(); ll ans = (tree.getProd(pos) * Y[pos]) % mod; return (int)ans; } int init(int N, int x[], int y[]) { n = N; for(int i=0; i<n; i++) { X[i] = x[i], Y[i] = y[i]; PS[i] = X[i]; if(i) PS[i] = (PS[i] * PS[i-1]) % mod; logX[i] = log10(X[i]), logY[i] = log10(y[i]); PL[i] = logX[i]; if(i) PL[i] += PL[i-1]; } tree.init(); return calc(); } int updateX(int p, int v) { X[p] = v, logX[p] = log10(v); tree.updateProd(p, v); return calc(); } int updateY(int p, int v) { return calc(); } // int main() { // int n; // cin >> n; // int x[n], y[n]; // for(int i=0; i<n; i++) cin >> x[i]; // for(int i=0; i<n; i++) cin >> y[i]; // cout << init(n, x, y) << '\n'; // int m; // cin >> m; // while(m--) { // int t, p, v; // cin >> t >> p >> v; // if(t == 1) updateX(p, v); // else updateY(p, v); // } // return 0; // }

Compilation message (stderr)

horses.cpp: In function 'int updateY(int, int)':
horses.cpp:120:17: warning: unused parameter 'p' [-Wunused-parameter]
  120 | int updateY(int p, int v) {
      |             ~~~~^
horses.cpp:120:24: warning: unused parameter 'v' [-Wunused-parameter]
  120 | int updateY(int p, int v) {
      |                    ~~~~^
#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...