Submission #866897

#TimeUsernameProblemLanguageResultExecution timeMemory
866897JakobZorzHorses (IOI15_horses)C++14
100 / 100
1197 ms75060 KiB
#include<iostream> #include<math.h> #include"horses.h" using namespace std; typedef long long ll; typedef long double ld; const int MOD=(int)1e9+7; const int TREE_SIZE=1<<19; int n; ld xlog[500000]; int y[500000]; ld ylog[500000]; ll powm(ll base,ll exp){ base%=MOD; exp%=MOD-1; ll res=1; for(int i=0;i<32;i++){ if(exp&(1<<i)) res=res*base%MOD; base=base*base%MOD; } return res; } ld tree1[2*TREE_SIZE]; ld lazy1[2*TREE_SIZE]; // push lazy void update1(int node){ if(lazy1[node]!=0){ tree1[node]+=lazy1[node]; if(node<TREE_SIZE){ lazy1[2*node]+=lazy1[node]; lazy1[2*node+1]+=lazy1[node]; } lazy1[node]=0; } } void add1(int node,int l,int r,int rl,int rr,ld c){ if(l<=rl&&rr<=r){ lazy1[node]+=c; update1(node); return; } update1(node); if(rr<=l||r<=rl) return; int mid=(rl+rr)/2; add1(2*node,l,r,rl,mid,c); add1(2*node+1,l,r,mid,rr,c); tree1[node]=max(tree1[2*node],tree1[2*node+1]); } int get1(int node,int rl,int rr){ if(rl==rr-1) return rl; int mid=(rl+rr)/2; if(tree1[2*node]>=tree1[2*node+1]) return get1(2*node,rl,mid); else return get1(2*node+1,mid,rr); } int get_maxi(){ return get1(1,0,TREE_SIZE); } ll tree2[2*TREE_SIZE]; void set2(int node,int pos,int rl,int rr,int val){ if(rl==rr-1){ tree2[node]=val; return; } int mid=(rl+rr)/2; if(pos<mid) set2(2*node,pos,rl,mid,val); else set2(2*node+1,pos,mid,rr,val); tree2[node]=tree2[2*node]*tree2[2*node+1]%MOD; } ll get2(int node,int pos,int rl,int rr){ if(rr<=pos) return tree2[node]; if(pos<rl) return 1; if(rl==rr-1) return tree2[node]; int mid=(rl+rr)/2; return get2(2*node,pos,rl,mid)*get2(2*node+1,pos,mid,rr)%MOD; } int get_prod(int maxi){ /*ll res=1; for(int i=0;i<=maxi;i++){ res*=x[i]; res%=MOD; } return int(res*y[maxi]%MOD);*/ return int(get2(1,maxi,0,TREE_SIZE)*y[maxi]%MOD); } void setx(int pos,int val){ ld new_val=log(val); add1(1,pos,n,0,TREE_SIZE,new_val-xlog[pos]); xlog[pos]=new_val; set2(1,pos,0,TREE_SIZE,val); } void sety(int pos,int val){ y[pos]=val; ld new_val=log(val); add1(1,pos,pos+1,0,TREE_SIZE,new_val-ylog[pos]); ylog[pos]=new_val; } // ------------------------------- int init(int N,int X[],int Y[]){ for(int i=0;i<2*TREE_SIZE;i++) tree2[i]=1; n=N; for(int i=0;i<n;i++){ setx(i,X[i]); sety(i,Y[i]); } return get_prod(get_maxi()); } int updateX(int pos,int val){ setx(pos,val); return get_prod(get_maxi()); } int updateY(int pos,int val){ sety(pos,val); return get_prod(get_maxi()); }
#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...