Submission #1319200

#TimeUsernameProblemLanguageResultExecution timeMemory
1319200ghammazhassanHorses (IOI15_horses)C++20
100 / 100
733 ms65180 KiB
#include "horses.h" #include <stdio.h> #include <stdlib.h> #include <iostream> #include <cmath> #include <algorithm> #include <map> #include <unordered_map> #include <vector> #include <iomanip> #include <string> #include <queue> #include <set> #include <deque> using namespace std; #define ll long long const ll M=1e9+7; const int N=5e5+5; static char _buffer[1024]; static int _currentChar = 0; static int _charsNumber = 0; int n; int a[N]; int b[N]; struct pii { ll vl=1; double vi=0; }; pii lz[4*N]; struct node { double mx=0; int pos=-1; ll pr=1; }; ll bp(ll x,ll y){ x%=M; if (y==0)return 1; if (y==1)return x; ll r=bp(x*x,y/2); if (y%2)r*=x; return r%M; } ll inv(ll x){ return bp(x,M-2); } node seg[4*N]; node join(node x,node y){ node r; r.mx=max(x.mx,y.mx); if (r.mx==x.mx)r.pos=x.pos; if (r.mx==y.mx)r.pos=y.pos; r.pr=(x.pr*y.pr)%M; return r; } void build(int s=0,int e=n,int v=1){ if (e-s==1){ seg[v].pos=s; seg[v].mx=log2(a[s]); seg[v].pr=a[s]; return; } int li=2*v; int ri=2*v+1; int m=(s+e)/2; build(s,m,li); build(m,e,ri); seg[v]=join(seg[li],seg[ri]); } void lazy(int v,int f){ ll x=lz[v].vl; lz[v].vl=1; seg[v].pr=(seg[v].pr*x)%M; double y=lz[v].vi; lz[v].vi=0; seg[v].mx+=y; if (f!=1){ lz[2*v].vl=(lz[2*v].vl*x)%M; lz[2*v+1].vl=(lz[2*v+1].vl*x)%M; lz[2*v].vi+=y; lz[2*v+1].vi+=y; } } void update(int l,int r,int x,int s=0,int e=n,int v=1){ lazy(v,e-s); if (l>=e or r<=s)return; if (l<=s and e<=r){ lz[v].vl=(lz[v].vl*x)%M; lz[v].vi+=log2(x); lazy(v,e-s); return; } int li=2*v; int ri=2*v+1; int m=(s+e)/2; update(l,r,x,s,m,li); update(l,r,x,m,e,ri); seg[v]=join(seg[li],seg[ri]); } void update1(int l,int r,int x,int s=0,int e=n,int v=1){ lazy(v,e-s); if (l>=e or r<=s)return; if (l<=s and e<=r){ lz[v].vl=(lz[v].vl*inv(x))%M; lz[v].vi-=log2(x); lazy(v,e-s); return; } int li=2*v; int ri=2*v+1; int m=(s+e)/2; update1(l,r,x,s,m,li); update1(l,r,x,m,e,ri); seg[v]=join(seg[li],seg[ri]); } node query(int l,int r,int s=0,int e=n,int v=1){ lazy(v,e-s); if (l>=e or r<=s)return node(); if (l<=s and e<=r)return seg[v]; int li=2*v; int ri=2*v+1; int m=(s+e)/2; node p=join(query(l,r,s,m,li),query(l,r,m,e,ri)); seg[v]=join(seg[li],seg[ri]); return p; } int init(int K,int x[],int y[]){ n=K; for (int i=0;i<4*N;i++){ lz[i].vl=1; } for (int i=0;i<n;i++){ a[i]=y[i]; } for (int i=0;i<n;i++){ b[i]=x[i]; } build(); for (int i=0;i<n;i++){ update(i,n,x[i]); } int po=query(0,n).pos; return query(po,po+1).pr; } int updateX(int i,int x){ update1(i,n,b[i]); b[i]=x; update(i,n,b[i]); int po=query(0,n).pos; return query(po,po+1).pr; } int updateY(int i,int x){ update1(i,i+1,a[i]); a[i]=x; update(i,i+1,a[i]); int po=query(0,n).pos; return query(po,po+1).pr; }
#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...