Submission #1248740

#TimeUsernameProblemLanguageResultExecution timeMemory
1248740KindaGoodGamesHorses (IOI15_horses)C++20
37 / 100
131 ms21332 KiB
#include<bits/stdc++.h> #include "horses.h" using namespace std; #define pii pair<int,int> #define int long long int mod = 1e9+7; const int STEPS = 30; int exp(int a, int k){ if(k == 0) return 1; int res = exp(a,k/2); if(k % 2 == 0){ return (res*res)%mod; }else{ return ((res*a%mod)*res)%mod; } } int inv(int a){ return exp(a,mod-2); } struct SegmentTree{ int len = 1; vector<int> S; SegmentTree(){} SegmentTree(int n){ while(len < n) len <<= 1; S.resize(2*len, 1); } int query(int ql, int qr, int l= 0, int r = -2, int i = 1){ if(r == -2) r = len; if(ql <= l && r <= qr) return S[i]; if(r <= ql || qr <= l) return 1; int mid = (l+r)/2; return (query(ql,qr,l,mid,i*2) * query(ql,qr,mid,r,i*2+1)) % mod; } void upd(int i, int v){ i += len; S[i] = v; for(i /= 2; i > 0; i /= 2){ S[i] = (S[i*2] * S[i*2+1])% mod; } } }; int n; vector<int> X; vector<int> Y; SegmentTree seg; int res = 0; int32_t init(int32_t N, int32_t mult[], int32_t cost[]) { n = N; X.resize(n); Y.resize(n); seg = SegmentTree(n); for(int i = 0; i < n; i++){ X[i] = mult[i]; Y[i] = cost[i]; } for(int i = 0;i < n; i++){ seg.upd(i, X[i]); } int cur = seg.query(0,n-STEPS); for(int i = max(0LL,n-STEPS); i < n; i++){ cur *= X[i]; cur %= mod; int c = 1; bool valid = false; for(int j = i+1; j < n; j++){ c *= X[j]; if(c > Y[i] || c *Y[j] > Y[i]){ valid = true; break; } } if(!valid){ res = (cur * Y[i])% mod; return res; } } res = (cur*Y[n-1])%mod; return res; } int32_t updateX(int32_t pos, int32_t val) { X[pos] = val; seg.upd(pos,val); int cur = seg.query(0,n-STEPS); for(int i = max(0LL,n-STEPS); i < n; i++){ cur *= X[i]; cur %= mod; int c = 1; bool valid = false; for(int j = i+1; j < n; j++){ c *= X[j]; if(c > Y[i] || c *Y[j] > Y[i]){ valid = true; break; } } if(!valid){ return (cur * Y[i])% mod; } } return (cur*Y[n-1])%mod; } int32_t updateY(int32_t pos, int32_t val) { Y[pos] = val; int cur = seg.query(0,n-STEPS); for(int i = max(0LL,n-STEPS); i < n; i++){ cur *= X[i]; cur %= mod; int c = 1; bool valid = false; for(int j = i+1; j < n; j++){ c *= X[j]; if(c > Y[i] || c *Y[j] > Y[i]){ valid = true; break; } } if(!valid){ return (cur * Y[i])% mod; } } return (cur*Y[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...