Submission #925182

#TimeUsernameProblemLanguageResultExecution timeMemory
925182KarootHorses (IOI15_horses)C++17
17 / 100
169 ms85320 KiB
#include "horses.h" #include <iostream> #include <cmath> #include <unordered_map> #include <map> #include <set> #include <queue> #include <vector> #include <string> #include <iomanip> #include <algorithm> #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() using namespace std; typedef long long ll; ll linf = 1e15+1; inline void scoobydoobydoo(){ ios::sync_with_stdio(false); ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const int M = 1e9+7; const int MAXN = 5e5+1; long double X[MAXN], Y[MAXN]; struct Node { long double sum; long double maxi; ll index; }; Node ST[4*MAXN]; int leftOf[4*MAXN], rightOf[4*MAXN]; int indexToNode[MAXN]; void buildTree(int l, int r, int node = 1){ leftOf[node] = l; rightOf[node] = r; if (l == r){ indexToNode[l] = node; ST[node].index = l; ST[node].maxi = log2(Y[l]); ST[node].sum = log2(X[l]); ST[node].maxi += ST[node].sum; return; } int mid = (l+r)>>1; buildTree(l, mid, 2*node); buildTree(mid+1, r, 2*node+1); ST[node].sum = ST[2*node].sum + ST[2*node+1].sum; if (ST[2*node].maxi > ST[2*node+1].maxi+ST[2*node].sum){ ST[node].index = ST[2*node].index; ST[node].maxi = ST[2*node].maxi; } else { ST[node].index = ST[2*node+1].index; ST[node].maxi = ST[2*node+1].maxi+ST[2*node].sum; } return; } int query(){ long double rest = ST[1].maxi - floor(ST[1].maxi); ll bigi = ST[1].maxi; ll soFar = 2; long double ans = 1; for (int i = 0; i <= log2(bigi)+1; i++){ if (bigi&(1<<i)){ ans = ((ll)ans*soFar)%M; } soFar *= soFar; soFar %= M; } ans *= pow(2.0, rest); return ((int)round(ans))%M; } void update1(int node){ if (!node)return; ST[node].sum = ST[2*node].sum + ST[2*node+1].sum; if (ST[2*node].maxi > ST[2*node+1].maxi+ST[2*node].sum){ ST[node].index = ST[2*node].index; ST[node].maxi = ST[2*node].maxi; } else { ST[node].index = ST[2*node+1].index; ST[node].maxi = ST[2*node+1].maxi+ST[2*node].sum; } update1(node>>1); } int updateX(int pos, int val){ ST[indexToNode[pos]].sum = log2((long double)val); ST[indexToNode[pos]].maxi = log2((long double)val) + log2(Y[pos]); update1(indexToNode[pos]>>1); return query(); } int updateY(int pos, int val){ ST[indexToNode[pos]].maxi = log2((long double)val) + log2(X[pos]); update1(indexToNode[pos]>>1); return query(); } int init(int n, int x[], int y[]) { for(int i = 0; i < n; i++){ X[i] = x[i]; Y[i] = y[i]; } buildTree(0, n-1); return query(); }

Compilation message (stderr)

horses.cpp: In function 'int query()':
horses.cpp:69:21: warning: conversion from 'long double' to 'll' {aka 'long long int'} may change value [-Wfloat-conversion]
   69 |     ll bigi = ST[1].maxi;
      |               ~~~~~~^~~~
#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...