제출 #86828

#제출 시각아이디문제언어결과실행 시간메모리
86828JustasZ말 (IOI15_horses)C++14
17 / 100
1308 ms53404 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], seg2[maxn*4]; set<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)); } void build2(int id=1, int l=0, int r=N-1) { if(l == r) { seg2[id]=X[l]; return; } int mid=(l+r)/2; build2(id*2, l, mid); build2(id*2+1, mid+1, r); seg2[id]=(seg2[id*2]*seg2[id*2+1])%mod; } void upd(int p, ll val, int id=1, int l=0, int r=N-1) { if(l == r) { seg2[id]=(seg2[id]*val)%mod; return; } int mid=(l+r)/2; if(p <= mid)upd(p, val, id*2, l, mid); else upd(p, val, id*2+1, mid+1, r); seg2[id]=(seg2[id*2]*seg2[id*2+1])%mod; } ll get(int x, int y, int id=1, int l=0, int r=N-1) { if(l > y || r < x)return 1; if(l >= x && r <= y)return seg2[id]; int mid=(l+r)/2; return (get(x, y, id*2, l, mid)*get(x, y, id*2+1, mid+1, r))%mod; } int getans() { ll ret=X[0]*query(0, N-1)%mod; if(sz(pos)) { auto it=prev(pos.end()); for(int c=0; c<=30; c++) { ret=max(ret, (get(0, *it)*query(*it, N-1))%mod); if(it == pos.begin())break; --it; } } return (int)ret; } 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--) pos.insert(i); build(); build2(); return getans(); } int updateX(int p, int val) { upd(p, (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; }*/
#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...