Submission #1197672

#TimeUsernameProblemLanguageResultExecution timeMemory
1197672cpdreamerHorses (IOI15_horses)C++20
17 / 100
1594 ms48808 KiB
#include "horses.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define V vector
using namespace std;
typedef long long ll;
#define all(v) v.begin(), v.end()
#define P pair
#define F first
#define S second
const ll MOD=(ll)1e9+7;
void file() {
    freopen("input.txt.txt", "r", stdin);
    freopen("output.txt.txt", "w", stdout);
}
struct segtree {
private:
    struct node {
        double ans;
        double sum;
        int id;
    };
    node single(P<P<double,double>,int>p) {
        return {p.F.F+p.F.S,p.F.F,p.S};
    }
    node neutral={0,0,-1};
    node merge(node a,node b) {
        if (a.id==-1)return b;
        if (b.id==-1)return a;
        node c;
        c.sum=a.sum+b.sum;
        if (a.ans>a.sum+b.ans) {
            c.ans=a.ans;
            c.id=a.id;
        }
        else {
            c.ans=b.ans+a.sum;
            c.id=b.id;
        }
        return c;
    }
public:
    int size;
    V<node>query;
    void init(int n) {
        size=1;
        while (size<n)size*=2;
        query.assign(2*size,neutral);
    }
    void build(V<P<double,double>>&a,int x,int lx,int rx) {
        if (rx-lx==1) {
            if (lx<a.size()) {
                query[x]=single({a[lx],lx});
            }
            return;
        }
        int m=(lx+rx)/2;
        build(a,2*x+1,lx,m);
        build(a,2*x+2,m,rx);
        query[x]=merge(query[2*x+1],query[2*x+2]);
    }
    void build(V<P<double,double>>&a) {
        build(a,0,0,size);
    }
    void set(int i,P<double,double>v,int x,int lx,int rx) {
        if (rx-lx==1) {
            query[x]=single({v,lx});
            return;
        }
        int m=(lx+rx)/2;
        if (i<m)
            set(i,v,2*x+1,lx,m);
        else
            set(i,v,2*x+2,m,rx);
        query[x]=merge(query[2*x+1],query[2*x+2]);
    }
    void set(int i,P<double,double>v) {
        set(i,v,0,0,size);
    }
};
int n;
segtree tree;
double A[(int)5e5+1],B[(int)5e5+1];
int a[(int)5e5+1],b[(int)5e5+1];
int f(int id) {
    ll x=1;
    for (int i=0;i<=id;i++) {
        x*=(ll)a[i]%MOD;
        x%=MOD;
    }
    x*=b[id];
    x%=MOD;
    return (int)x;
}
int init(int N, int X[], int Y[]) {
    n=N;
    for (int i=0;i<n;i++) {
        a[i]=X[i];
        b[i]=Y[i];
    }
    for (int i=0;i<n;i++) {
        A[i]=log(X[i]);
        B[i]=log(Y[i]);
    }
    tree.init(n);
    V<P<double,double>>vp;
    for (int i=0;i<n;i++) {
        vp.pb({A[i],B[i]});
    }
    tree.build(vp);
    return f(tree.query[0].id);
}
int updateX(int pos, int val) {
    a[pos]=val;
    A[pos]=log(a[pos]);
    tree.set(pos,{A[pos],B[pos]});
    return f(tree.query[0].id);
}
int updateY(int pos, int val) {
    b[pos]=val;
    B[pos]=log(a[pos]);
    tree.set(pos,{A[pos],B[pos]});
    return f(tree.query[0].id);
}

Compilation message (stderr)

horses.cpp: In function 'void file()':
horses.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     freopen("input.txt.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
horses.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen("output.txt.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...