Submission #1213056

#TimeUsernameProblemLanguageResultExecution timeMemory
1213056Saul0906Horses (IOI15_horses)C++20
100 / 100
549 ms83600 KiB
#include "horses.h" #include <bits/stdc++.h> #define mid ((l+r)>>1) #define rep(a,b,c) for(int a=b; a<c; a++) #define repr(a,b,c) for(int a=b-1; a>c-1; a--) #define repa(a,b) for(auto a:b) #define pii pair<int, int> #define fi first #define se second #define all(a) a.begin(), a.end() #define ll long long #define pb push_back using namespace std; const ll inf=1e18, mod=1e9+7; const int N=5e5+5; struct segtree{ segtree *left, *right; int l, r; ll X, Y=0; segtree(int x, int y): l(x), r(y){ if(l==r) return; left = new segtree(l,mid); right = new segtree(mid+1,r); } void updateX(int x, int y){ if(x<l || r<x) return; if(x==l && r==x){ X=y; return; } left->updateX(x,y); right->updateX(x,y); X=((left->X)*(right->X))%mod; } void updateY(int x, int y){ if(x<l || r<x) return; if(x==l && r==x){ Y=y; return; } left->updateY(x,y); right->updateY(x,y); Y=max(left->Y,right->Y); } ll queryX(int x, int y){ if(y<l || r<x) return 1; if(x<=l && r<=y) return X; return (left->queryX(x,y))*(right->queryX(x,y))%mod; } ll queryY(int x, int y){ if(y<l || r<x) return 0; if(x<=l && r<=y) return Y; return max(left->queryY(x,y),right->queryY(x,y)); } } st(0,N); set<int> p; ll A[N], B[N], n; int solve(){ auto it=p.rbegin(); vector<pii> segs; segs.pb({n,0}); ll mul=1, mx=0, px, ax=1; while(it!=p.rend() && mul<=1e9){ mul*=A[*it]; segs.pb({*it,0}); it++; } if(segs.back().fi>0 && mul<=1e9) segs.pb({0,0}); reverse(all(segs)); px=st.queryX(0,segs[0].fi); rep(i,0,segs.size()-1) segs[i].se=st.queryY(segs[i].fi,segs[i+1].fi-1); mx=segs[0].se; rep(i,1,segs.size()-1){ ax*=A[segs[i].fi]; mx=max(mx,ax*segs[i].se); } return (px*(mx%mod))%mod; } int init(int N, int X[], int Y[]){ rep(i,0,N){ st.updateX(i,X[i]); st.updateY(i,Y[i]); if(X[i]>1) p.insert(i); A[i]=X[i]; B[i]=Y[i]; } n=N; return solve(); } int updateX(int pos, int val) { st.updateX(pos,val); if(A[pos]>1) p.erase(pos); A[pos]=val; if(A[pos]>1) p.insert(pos); return solve(); } int updateY(int pos, int val) { st.updateY(pos,val); 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...