Submission #620071

#TimeUsernameProblemLanguageResultExecution timeMemory
620071Bench0310Horses (IOI15_horses)C++17
100 / 100
673 ms65524 KiB
#include <bits/stdc++.h> #include "horses.h" using namespace std; typedef long long ll; const ll mod=1000000007; const ll lim=1000000000; ll mul(ll a,ll b){return (a*b)%mod;}; const int N=500005; int n; ll x[N]; ll y[N]; ll treex[4*N]; ll treey[4*N]; set<int> s; void pull(int idx) { treex[idx]=mul(treex[2*idx],treex[2*idx+1]); treey[idx]=max(treey[2*idx],treey[2*idx+1]); } void build(int idx,int l,int r) { if(l==r) { treex[idx]=x[l]; treey[idx]=y[l]; } else { int m=(l+r)/2; build(2*idx,l,m); build(2*idx+1,m+1,r); pull(idx); } } void update(int idx,int l,int r,int pos,ll val,int t) { if(l==r) { if(t==0) treex[idx]=val; else treey[idx]=val; } else { int m=(l+r)/2; if(pos<=m) update(2*idx,l,m,pos,val,t); else update(2*idx+1,m+1,r,pos,val,t); pull(idx); } } ll query(int idx,int l,int r,int ql,int qr,int t) { if(ql>qr) return (1-t); if(l==ql&&r==qr) return (t==0?treex[idx]:treey[idx]); int m=(l+r)/2; ll one=query(2*idx,l,m,ql,min(qr,m),t); ll two=query(2*idx+1,m+1,r,max(ql,m+1),qr,t); if(t==0) return mul(one,two); else return max(one,two); } int solve() { bool rm=0; if(s.find(0)==s.end()) { rm=1; s.insert(0); } ll best=0; int nxt=n; for(auto it=s.rbegin();it!=s.rend();it++) { int p=(*it); best=x[p]*max(best,query(1,0,n-1,p,nxt-1,1)); nxt=p; if(best>=lim) break; } if(rm) s.erase(0); return int(mul(best%mod,query(1,0,n-1,0,nxt-1,0))); } int init(int tn,int X[],int Y[]) { n=tn; for(int i=0;i<n;i++) { x[i]=X[i]; y[i]=Y[i]; if(x[i]>1) s.insert(i); } build(1,0,n-1); return solve(); } int updateX(int pos,int val) { if(x[pos]>1) s.erase(pos); x[pos]=val; if(x[pos]>1) s.insert(pos); update(1,0,n-1,pos,x[pos],0); return solve(); } int updateY(int pos,int val) { y[pos]=val; update(1,0,n-1,pos,y[pos],1); return solve(); }
#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...