제출 #1200913

#제출 시각아이디문제언어결과실행 시간메모리
1200913PlayVoltz말 (IOI15_horses)C++20
100 / 100
327 ms103172 KiB
#include "horses.h" #include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> #define mp make_pair #define pb push_back #define fi first #define se second const int MOD = 1e9+7; int n, t=1; vector<int> x; multiset<pii> s; struct node{ int s, e, m, val; node *l, *r; node(int S, int E){ s = S, e = E, m = (s+e)/2; val=0; if (s!=e){ l = new node(s, m); r = new node(m+1, e); } } void up(int ind, int nv){ if (s==e)val=nv; else{ if (ind<=m)l->up(ind, nv); else r->up(ind, nv); val = max(l->val, r->val); } } int query(int left, int right){ if (s==left && e==right)return val; if (right<=m)return l->query(left, right); else if (left>m)return r->query(left, right); else return max(l->query(left, m), r->query(m+1, right)); } }*st; int inv(int num){ int p=MOD, res=1, y=0; while (num>1){ int q=num/p, t=p; p=num%p, num=t, t=y, y=res-q*y, res=t; } if (res<0)res+=MOD; return res; } int query(){ int res=1, c=t; for (auto a:s){ int i=-a.fi, v=a.se; res=max(res, st->query(i, n-1)); res*=v; c=(c*inv(v))%MOD; if (res>1e9)break; } res%=MOD; return (c*res)%MOD; } signed init(signed N, signed X[], signed y[]){ n=N; x.resize(n); st = new node(0, n-1); for (int i=0; i<n; ++i){ x[i]=X[i]; if (x[i]>1)s.insert(mp(-i, x[i])); t=(t*x[i])%MOD; st->up(i, y[i]); } s.insert(mp(0, 1)); return query(); } signed updateX(signed pos, signed val){ if (x[pos]>1)s.erase(s.find(mp(-pos, x[pos]))); t=(((t*inv(x[pos]))%MOD)*val)%MOD; x[pos]=val; if (val>1)s.insert(mp(-pos, x[pos])); return query(); } signed updateY(signed pos, signed val) { st->up(pos, val); return query(); }
#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...