Submission #86847

#TimeUsernameProblemLanguageResultExecution timeMemory
86847JustasZHorses (IOI15_horses)C++14
0 / 100
739 ms48940 KiB
#include "horses.h" #include <bits/stdc++.h> #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) (int)a.size() #define x first #define y second #define debug(...) "["<<#__VA_ARGS__<<": "<<__VA_ARGS__<<"]" using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int>pii; const int maxn=5e5+100; const int mod=1e9+7; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll pwr(ll a, ll pw) { ll ret=1; while(pw>0) { if(pw&1)ret=ret*a%mod; a=a*a%mod; pw>>=1; } return ret; } ll modinv(ll a) { return pwr(a, mod-2); } int N; ll X[maxn], Y[maxn], seg[maxn*4]; set<int, greater<int> >pos; void build(int id=1, int l=0, int r=N-1) { if(l == r) { seg[id]=Y[l]; return; } int mid=(l+r)/2; build(id*2, l, mid); build(id*2+1, mid+1, r); seg[id]=max(seg[id*2], seg[id*2+1]); } void modify(int p, ll d, int id=1, int l=0, int r=N-1) { if(l == r) { seg[id]+=d; return; } int mid=(l+r)/2; if(p <= mid)modify(p, d, id*2, l, mid); else modify(p, d, id*2+1, mid+1, r); seg[id]=max(seg[id*2], seg[id*2+1]); } ll query(int x, int y, int id=1, int l=0, int r=N-1) { if(l > y || r < x)return 0; if(l >= x && r <= y)return seg[id]; int mid=(l+r)/2; return max(query(x, y, id*2, l, mid), query(x, y, id*2+1, mid+1, r)); } ll F[maxn]; void upd(int p, ll val) { for(; p<=N; p+=p&-p) F[p]=(F[p]*val)%mod; } ll get(int p) { ll ret=1; for(; p>0; p-=p&-p) ret=(ret*F[p])%mod; return ret; } int getans() { ll id=0, prod=1, besty=0, bestprod=0; auto it=pos.begin(); for(int c=0; c<30; c++) { if(it == pos.end())break; ll yy=query(*it, N-1); if(yy > prod) { if(besty*prod < yy*bestprod) besty=yy, bestprod=prod, id=*it; } prod*=X[*it]; if(prod > mod)break; ++it; } return (int)(get(id+1)*query(id, N-1)%mod); } 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]; for(int i=N-1; i>=0; i--) if(X[i] >= 2) pos.insert(i); build(); for(int i=1; i<=N; i++) F[i]=1; for(int i=0; i<N; i++) upd(i+1, X[i]); return getans(); } int updateX(int p, int val) { upd(p+1, val*modinv(X[p])%mod); if(X[p] == 1 && val >= 2)pos.insert(p); if(X[p] >= 2 && val == 1)pos.erase(p); X[p]=val; return getans(); } int updateY(int p, int val) { ll d=val-Y[p]; modify(p, d); Y[p]=val; return getans(); } /*int main() { ios_base::sync_with_stdio(false), cin.tie(0); freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); int n, A[maxn], B[maxn]; cin>>n; for(int i=0; i<n; i++) cin>>A[i]; for(int i=0; i<n; i++) cin>>B[i]; cout<<init(n, A, B)<<"\n"; int m; cin>>m; while(m--) { int a, b, c; cin>>a>>b>>c; if(a == 1)cout<<updateX(b, c)<<"\n"; else cout<<updateY(b, c)<<"\n"; } return 0; }*/

Compilation message (stderr)

horses.cpp: In function 'int getans()':
horses.cpp:96:24: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
     return (int)(get(id+1)*query(id, N-1)%mod);
                      ~~^~
horses.cpp:96:41: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
     return (int)(get(id+1)*query(id, N-1)%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...