Submission #1255345

#TimeUsernameProblemLanguageResultExecution timeMemory
1255345lambd47Horses (IOI15_horses)C++20
100 / 100
497 ms40656 KiB
#include<bits/stdc++.h>
#include"horses.h"
using namespace std;

#define ld long double
#define ll long long


const int mod=1e9+7;
vector<int> x,y;
int n ;
set<pair<int,int>,greater<pair<int,int>>> s;
vector<int> seg;
ll prod;

ll exp(int x,int pot){
    ll pat=x;
    ll ret=1;
    while(pot){
        if(pot%2){
            ret*=pat;
            ret%=mod;
        }
        pat*=pat;
        pat%=mod;
        pot/=2;
    }
    return ret;
}
ll inv(int x){
    return exp(x,mod-2);
}

void update(int pos, int ini, int fim, int id, int val){
    if(ini>id || fim<id)return;
    if(ini==fim){
        seg[pos]=val;return;
    }
    int e=2*pos,d=2*pos+1;
    int m=(ini+fim)/2;
    update(e,ini,m,id,val);
    update(d,m+1,fim,id,val);
    seg[pos]=max(seg[e],seg[d]);
}

int query(int pos, int ini,int fim, int l, int r){
    if(ini>r || fim<l)return 1;
    if(l<= ini && fim <= r)return seg[pos];
    int m=(ini+fim)/2;
    int e=2*pos,d=2*pos+1;
    return max(query(e,ini,m,l,r),query(d,m+1,fim,l,r));

}

int calc(){
    auto pt=s.begin();
    ll prodat=1;
    int rx=1;
    int ry=1;
    ld r=1;
    while(pt!=s.end() && prodat<mod){
        auto [id,val]=(*pt);
        pt++;
        int yat=query(1,1,n,id,n);
        ld at=(ld)prodat/(ld)yat;
        if(at<r){
            r=at;
            rx=prodat;
            ry=yat;
        }
        prodat*=val;
    }
    ll resp=prod;
    resp*=ry;
    resp%=mod;
    resp*=inv(rx);
    resp%=mod;
    return resp;
}

int init(int N, int X[], int Y[]){
    n=N;
    prod=1;
    x.resize(n+1),y.resize(n+1);
    s.insert({0,1});
    seg.resize(4*n+8);
    for(int i=0;i<n;i++){
        x[i+1]=X[i];
        prod*=x[i+1];
        prod%=mod;
        y[i+1]=Y[i];
        update(1,1,n,i+1,y[i+1]);
        if(x[i+1]!=1){
            s.insert({i+1,x[i+1]});
        }
    }
    return calc();
}

int updateX(int pos, int val){
    pos++;
    if(x[pos]!=1){
        s.erase({pos,x[pos]});
        prod*=inv(x[pos]);
        prod%=mod;
    }
    x[pos]=val;
    if(x[pos]!=1){
        prod*=x[pos];
        prod%=mod;
        s.insert({pos,x[pos]});
    }
    return calc();
}
int updateY(int pos, int val){
    pos++;
    update(1,1,n,pos,val);
    return calc();
}
#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...