Submission #800823

#TimeUsernameProblemLanguageResultExecution timeMemory
800823LiudasHorses (IOI15_horses)C++17
100 / 100
273 ms62316 KiB
#include <bits/stdc++.h>
#include "horses.h"
using namespace std;
class segtree{
public:
    struct nodes{
        double clogx, clogy;
        double logx;
        long long X;
        long long cX, cY;
    };
    vector<long long> X, Y;
    vector<nodes> tree;
    long long N;
    long long MOD = 1e9 + 7;
    nodes comp(nodes a, nodes b){
        nodes c = a;
        c.logx += b.logx;
        c.X = 1ll * c.X * b.X % MOD;
        if(a.clogy + a.clogx < a.logx + b.clogx + b.clogy){
            c.clogy = b.clogy;
            c.clogx = a.logx + b.clogx;
            c.cX = 1ll * a.X * b.cX % MOD;
            c.cY = b.cY;
        }
        return c;
    }
    void init(long long NN){
        X.assign(NN, 0);
        Y.assign(NN, 0);
        long long K = 1;
        while(K <= NN) K *= 2;
        N = K;
        tree.assign(K * 2, {0, 0, 0, 0, 0, 0});
    }
    void add(int node, int l, int r, int pos){
        if(pos < l || pos >= r){
            return;
        }
        if(r - l == 1){
            tree[node].X = X[pos];
            tree[node].cX = X[pos];
            tree[node].cY = Y[pos];
            tree[node].logx = log((double)(X[pos]));
            tree[node].clogx = log((double)(X[pos]));
            tree[node].clogy = log((double)(Y[pos]));
            return;
        }
        int mid = (l + r) / 2;
        if(pos < mid){
            add(node * 2 + 1, l, mid, pos);
        }
        else{
            add(node * 2 + 2, mid, r, pos);
        }
        tree[node] = comp(tree[node * 2 + 1], tree[node * 2 + 2]);
    }
    void add(int pos){
        add(0, 0, (int)N, pos);
    }
    long long ans(){
        return 1ll * tree[0].cX * tree[0].cY % MOD;
    }
};
segtree tree;
int init(int NN, int XX[], int YY[]){
    int N = NN;
    tree.init(N);
    for(int i = 0; i < N; i ++){
        tree.X[i] = XX[i];
        tree.Y[i] = YY[i];
        tree.add(i);
    }
    return (int)tree.ans();
}
int updateX(int pos, int val){
    tree.X[pos] = val;
    tree.add(pos);
    return (int)tree.ans();
}
int updateY(int pos, int val){
    tree.Y[pos] = val;
    tree.add(pos);
    return (int)tree.ans();
}
#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...