Submission #1312874

#TimeUsernameProblemLanguageResultExecution timeMemory
1312874nikaa123Horses (IOI15_horses)C++20
34 / 100
188 ms50800 KiB
#include <bits/stdc++.h> #include "horses.h" #define ll long long using namespace std; const int inf = INT_MAX; const ll mod = 1000000007; const int S = 5e5+5; ll n; ll x[S],y[S]; ll pref[S]; float prefl[S]; struct NODE{ ll modval = 1; float logval = 0; } t[4*S],lazy[4*S]; NODE merge(NODE a, NODE b) { if (a.logval >= b.logval) return a; return b; } void applay(int node, ll mval, float lval) { t[node].modval = (t[node].modval * mval) % mod; lazy[node].modval = (lazy[node].modval * mval) % mod; t[node].logval += lval; lazy[node].logval += lval; } void push(int node) { if (!(lazy[node].modval == 1 && lazy[node].logval == 0)) { applay(node*2,lazy[node].modval, lazy[node].logval); applay(node*2+1,lazy[node].modval, lazy[node].logval); lazy[node].modval = 1; lazy[node].logval = 0; } } void update(int node, int l, int r, int L, int R, ll val, float lval) { if (r < L || l > R) return; if (l >= L && r <= R) { applay(node,val,lval); return; } push(node); int mid = (l+r)/2; update(node*2,l,mid,L,R,val,lval); update(node*2+1,mid+1,r,L,R,val,lval); t[node] = merge(t[node*2],t[node*2+1]); } NODE getans(int node, int l, int r, int L, int R) { NODE res; res.modval = -inf; res.logval = -inf; if (r < L || l > R) return res; if (l >= L && r <= R) return t[node]; push(node); int mid = (l+r)/2; return merge(getans(node*2,l,mid,L,R),getans(node*2+1,mid+1,r,L,R)); } ll inv(ll x, int k = mod - 2) { ll res = 1; while (k) { if (k&1) { res = (res * x) % mod; } x = (x * x) % mod; k >>= 1; } return res; } 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]; } pref[0] = x[0]; prefl[0] = log(x[0]); for (int i = 1; i < n; i++) { pref[i] = (pref[i-1] * x[i]) % mod; prefl[i] = prefl[i-1] + log(x[i]); } for (int i = 0; i < n; i++) { pref[i] = (pref[i] * y[i]) % mod; prefl[i] += log(y[i]); } for (int i = 1; i <= n; i++) { update(1,1,n,i,i,pref[i-1],prefl[i-1]); } return getans(1,1,n,1,n).modval; } int updateX(int pos, int val) { update(1,1,n,pos+1,n,inv(x[pos]),-log(x[pos])); x[pos] = val; update(1,1,n,pos+1,n,x[pos],log(x[pos])); return getans(1,1,n,1,n).modval; } int updateY(int pos, int val) { update(1,1,n,pos+1,pos+1,inv(y[pos]),-log(y[pos])); y[pos] = val; update(1,1,n,pos+1,pos+1,y[pos],log(y[pos])); return getans(1,1,n,1,n).modval; }
#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...